Go语言并发之美

EMC中国研究院 颜开 简介 多核处理器越来越普及,那有没有一种简单的办法,能够让我们写的软件释放多核的威力?答案是:Yes。随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式需要有一个极其简洁的内核,还有在此之上丰富的外延,可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延。 并发模式之内核 这种并发模式的内核只需要协程和通道就够了。其中协程负责执行代码,通道负责在协程之间传递事...阅读全文

CSDN博客 2014-01-10 17:28 kjfcpua

Go的List操作上的一个小“坑”

一直想不清楚一个问题,简单设计的东西到底是“坑多”还是“坑少”呢? 复杂的设计,考虑的太全面,使用起来更麻烦,使用者容易陷入乱,落入自身的陷阱;而简单的设计呢,在许多方面上又顾及不周,如果使用者对其“设计”没仔细研究,或者其实现本身又是一个黑盒子,也容易掉入到设计本身遗留下来的“陷阱”。下面是我刚开始使用Go写代码时碰到的一个小“坑”,这个“坑”的原因我归结为后者。 这个“小坑”来自于go的container/list package的使用上。导致“坑”的代码大概如下所示: 1 2 3 4 5 ...阅读全文

CSDN博客 2014-01-21 17:34 kjfcpua

golang基础知识

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 今天说一些golang的基础知识,还有你们学习会遇到的问题,先讲解hello word [php] package main import "fmt" func main() { fmt.Println("你好,微度网络"); } [/php] package name 包机制,每一个独立的go程序都需要有一个package main的申明,主要是要为下边入口函数main()做申明的,import...阅读全文

Golang学习(8)——io 包

Golang学习 - io 包--------------------先说一下接口,Go 语言中的接口很简单,在 Go 语言的 io 包中有这样一个函数:func ReadFull(r Reader, buf []byte) (n int, err error)这个函数可以把对象 r 中的数据读出来,然后存入一个缓冲区 buf 中,以便其它代码可以处理 buf 中的数据。这里有个问题,ReadFull 函数究竟可以读取哪些对象的数据?可以读文件中的数据吗?可以读网络中的数据吗?可以读数据库中的数...阅读全文

51CTO博客 2016-11-25 16:44:27 1160636144

Plan 9安装Go

I、安装python和mercurial(hg) 首先是在term中输入9fs sources, 然后cd到/n/sources/contrib下,参照Plan 9的contrib index,找到"From fgb's contrib"的python用户名。 % 9fs sources % /n/sources/contrib/fgb/root/rc/bin/contrib/install fgb/contrib % contrib/install -f bichued/python % co...阅读全文

CSDN博客 2011-02-21 22:24 bonny95

剖析Go1.3新特性:sync.Pool

Go 1.3 的sync包中加入一个新特性:Pool。官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。 type Pool func (p *Pool) Get() interface{} func (p *Pool) Put(x interface{}) New func() interface{} Get返回Pool中的任意一个对象。如果Pool为空,则调用New返回一个新创建的对象。...阅读全文

CSDN博客 2014-08-06 17:33 tiaotiaoyly

Golang学习(7)——sync包

Golang学习 - sync 包--------------------临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重。其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用)。   从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函数创建一个新对象返回。Pool 可以安全的在...阅读全文

51CTO博客 2016-11-25 16:08:45 1160636144

Golang学习(6)——sort包

Golang学习 - sort 包--------------------// 满足 Interface 接口的类型可以被本包的函数进行排序。type Interface interface { // Len 方法返回集合中的元素个数 Len() int // Less 方法报告索引 i 的元素是否比索引 j 的元素小 Less(i, j int) bool // Swap 方法交换索引 i 和 j 的两个元素的位置 Swap(i, j int)}// 对 data 进行排序(不保证相等元素的相...阅读全文

51CTO博客 2016-11-25 15:55:30 1160636144

在windows下配置GO编译环境

1、下载安装包 大家可以从Go lang主页上找到各个平台下的安装方法: 主页:http://golang.org/# 安装文档:http://golang.org/doc/install Go source: http://code.google.com/p/go/ windows 下载包:http://code.google.com/p/go/downloads/list?q=OpSys-Windows+Type%3DInstaller 我自己下载的是msi包,这个不要设置环境变量,安装完成...阅读全文

CSDN博客 2012-07-03 12:35 shlpyy

Go是如何用组合实现继承的

Go提供了很赞的并发支持,但是Go并不支持完全的面向对象。这并不代表Go不支持面向对象,而且Go的OO系统做的非常轻量,学习成本压到了最小。尽管为了做到这种轻量级的面向对象让Go失去了一些OO的方便特性,但是更高的效率和多返回值多少弥补了这一点。 那些完全支持面向对象的语言一般都具有继承的功能。继承有很棒的优点,最简单了讲,就是可以少写代码。当然,继承并不仅仅是让你省了敲几下键盘的功夫,它还能更好的抽象程序中各种类型之间的关系。 Go的OO系统不支持继承,但是可以使用Go中一种叫做"组合"的方法...阅读全文

CSDN博客 2014-07-22 15:57 gophers

进一步认识golang中的并发

如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟。需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发。 并发的意义就是:让一个程序同时做多件事情! 理解这一点非常重要,是的,并发的目的只是为了能让程序同时做另一件事情而已,并发的目的并不是让程序运行的更快(如果是多核处理器,而且任务可以分成相互独立的部分,那么并发确实可以让事情解决的更快)。记得我学C++那时候开始接触并发,还以为每开一个线程程序就会加速一倍呢...阅读全文

CSDN博客 2014-04-28 22:24 gophers

Golang学习(5)——strconv包

Golang学习 - strconv 包--------------------// 将布尔值转换为字符串 true 或 falsefunc FormatBool(b bool) string// 将字符串转换为布尔值// 它接受真值:1, t, T, TRUE, true, True// 它接受假值:0, f, F, FALSE, false, False// 其它任何值都返回一个错误。func ParseBool(str string) (bool, error)--------------...阅读全文

51CTO博客 2016-11-25 14:31:19 1160636144

Golang中如何模拟C语言中的if(scanf(…)==EOF)来控制输入的终止

相信很多从C/C++转到Golang的朋友们都经常会对Go中的输入控制感到头疼。。。尤其是如果要在Go中模拟C语言中的如下代码会遇到不小困惑: char input[100]; while (1) { if (scanf("%s", input) == EOF) { printf("输入结束\n"); break; } } 上面这段代码在控制台中输入一个Ctrl+Z(EOF) 就可以终止输入了: C语言中的 int scanf() 函数返回的是一个int类型,它的值只有三种情况: (1) 如果一...阅读全文

CSDN博客 2014-03-06 22:30 gophers

Go中error类型的nil值和nil

先看C语言中的类似问题:空字符串。 const char* empty_str0 = ""; const char* empty_str1 = "\0empty"; const char* empty_str2 = NULL; 以上3个字符串并不相等,但是从某种角度看,它们都是对应空的字符串。 empty_str0 指向一个空的字符串,但是empty_str0本身的值是有效的。 empty_str1 指向一个非空的字符串,但是字符串的第一个字符是'\0'。 empty_str2 本身是一个空的指...阅读全文

开源中国博客 2013-03-27 10:30 chai2010

GO语解惑:从源码分析GO程序的入口

起因 最近几天学完了GO语言,但是教材里给出的信息太少,不能满足需要。于是在网上看了许多博文,这就发现其中有许多冲突之处,使人越发迷惑。为了解惑,我深入分析了一下GO语言而小有心得,想把其中的一些分享给大家,希望能提高大家的学习效率。 GO语言的真正入口 GO语言的runtime.Caller方法会提供当前goroutine的栈上的函数调用信息,主要有当前的PC值和调用的文件和行号。若无法获得信息,第四个返回的值为false。当我们在main.main里使用这个函数(本函数为转载): func ...阅读全文

开源中国博客 2014-04-01 12:22 sz_Promi

【干货】Gisp 解释器 Golang 辅助开发工具

Gisp 是一个提供给 golang 使用的 Lisp 类 DSL 解释器。在 Lisp 的基本语法基础上,针对 go 环境稍作了一点语法糖。主要目标是提供一个尽可能便于与 golang 互操作的微型DSL工具。 简介 Gisp用go语言编写,是一个DSL 解释器,这个 DSL 基本上就是 LIsp 的基础语法,针对go程序的互操作需要稍微做了一点扩展。它的主要设计目标是尽可能方便的在 go 程序中调用 gisp 解释器,执行 dsl。 我们的项目,目前后台主要用 golang 开发。开发过程中...阅读全文

ITEYE资讯 2014-10-24 15:44 mengyidan1988

go学习(四)简单的网站

一、写在之前: 这几天闻听go出了1.1版。网上传其性能是原来的两倍。当然有好多反对声音。不过了作为一个一心想弄go的人就在想。我怎么升级了。怎么升级了? win不用说直接重新下载。 linux了: $ cd go/src $ hg pull $ hg update release $ ./all.bash 哈就这么简单! 二、开始web 代码很简单啊。真没想到这么简单!: package main import ( "io" "net/http" "log" ) // hello world,...阅读全文

CSDN博客 2013-05-20 21:52 xming4321

go programming language(2)

http://tour.golang.org/#1一个很方便学习go的网站 今天看了一下go的流程和面向对象,印象比较深的有 1 go的var的定义格式和c相反 2 go可以多个参数一起赋值 3 go的函数可以有多个返回数值 4 go的语法糖,给任意类型添加函数 5 大小写来区别package函数的private和public 大体感觉go就是一个比较时髦的C, 下一步的学习并行和网络编程,还有一本effective Go的书。 http://go.tuna.tsinghua.edu.cn/do...阅读全文

CSDN博客 2013-01-24 22:48 wangeen