Skip to content

Instantly share code, notes, and snippets.

@congjf
Last active August 29, 2015 13:57
Show Gist options
  • Save congjf/9541247 to your computer and use it in GitHub Desktop.
Save congjf/9541247 to your computer and use it in GitHub Desktop.
Golang Spec in Chinese

go

“go”语句会在一个独立的控制线程(或goroutine)中执行一个方法(在相同的地址究竟内部)。

GoStmt = "go" Expression .

expression表达式必须是一个方法或一个函数。内建方法被限制用于expression表达式。

方法值与参数通常在正在调用的goroutine中被计算,但是与常规调用不同,程序执行不会等待expression中的方法执行完成。换言之,方法在一个新的独立的goroutine中执行。当方法执行完毕,它的goroutine会被终止。如果方法返回了一些值,这些值会在方法完成时被丢弃。

go Server()
go func(ch chan<- bool) { for { sleep(10); ch <- true; }} (c)

rune

用于表示一个符号常量。用数值来指定Unicode码。在go中,我们可以直接使用单引号将字母括起来的方式来表明这个常量是什么。如:

type key struct{
    x rune
}

var kk =key{'x'}

参考:

chan

一个channel(通道)提供一个机制,并发的执行方法以及相互传递指定元素类型的值。没有经过初始化的channel是__nil__。

ChannelType = ( "chan" [ "<-" ] | "<-" "chan" ) ElementType .

<-操作指定channel的方向,发送或接收。如果方向没有指定,channel就是双向的。一个channel可能仅包含发送或接收。

chan T          // 可以用于发送或接收T类型的数据
chan<- float64  // 仅能够发送float64类型的数据
<-chan int      // 仅能够接收int类型的数据

带有左侧辅助chan的<-操作符:

chan<- chan int    // 与 chan<- (chan int) 相同
chan<- <-chan int  // 与 chan<- (<-chan int) 相同
<-chan <-chan int  // 与 <-chan (<-chan int) 相同
chan (<-chan int)

一个新的channel可以使用内建方法make来初始化,在make方法中,需要带有chan的类型与容量:

make(chan int, 100)

容器的数量设置channel中缓存的尺寸。如果容量大于0,channel就是异步的:只要缓存不满(发送)或非空(接收),通信就是非阻塞的。如果容量为0或不存在,只有当发送者与接收者都准备就绪后,都会通信成功。一个nil channel永远不会处在准备就绪状态。

一个channel可以被内建方法close关闭;可以使用被赋予多个值的接收操作测试一个channel是否被关闭。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment