在 Golang 中有一个神奇的 Channel,携程间的同步主要可以依靠它来实现。不过其中有几个使用中的问题需要注意,有无缓冲,channel 超时等。

1. 无缓冲 Channel

无缓冲的 Channel 可以通过如下方法创建:

c := make(chan int)
c <- 1
log.Println("Hi")

这里不会被直接放入 c 通道,而是当在别的携程有 <-c 调用后, log.Println("Hi") 才会被执行。这里来看另一个例子:

c := make(chan int)
c <- func () int {
    log.Println("Start")
    return 1
}()
log.Println("Hi")

这个例子中 log.Println("Start") 会被执行,然后程序会等待别的携程执行 <-c,再输出 log.Println("Hi")

2. 有缓冲 Channel

有缓冲 Channel 的创建方式类似

c := make(chan int, 1)

同无缓冲的最大区别是,只有当缓冲区满了之后才会停止当前的程序,否则会一直运行。

3. Channel 超时

Golang 的 Channel 没有内置超时机制,但是可以使用 selecttime 来实现。

c := make(chan int)
select {
case <-c:
    // ...
case <-time.After(time.Second*10):
    // ...
}

这里通过 timeAfter 方法来实现超时机制。