文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
channels
goroutine
运行在相同的地址空间,因此访问共享内存必须做好同步。那么 goroutine
之间如何进行数据的通信呢,Go 提供了一个很好的通信机制 channel
。 channel
可以与 Unix shell
中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型: channel 类型
。定义一个 channel
时,也需要定义发送到 channel
的值的类型。注意,必须使用 make
创建 channel
:
ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})
channel
通过操作符 <-
来接收和发送数据
ch <- v // 发送 v 到 channel ch.
v := <-ch // 从 ch 中接收数据,并赋值给 v
把这些应用到例子中来:
package main
import "fmt"
func sum(a []int, c chan int) {
total := 0
for _, v := range a {
total += v
}
c <- total // send total to c
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // receive from c
fmt.Println(x, y, x + y)
}
默认情况下, channel
接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得 Goroutines
同步变的更加的简单,而不需要显式的 lock
。所谓阻塞,也就是如果读取( value := <-ch
)它将会被阻塞,直到有数据接收。其次,任何发送( ch<-5
)将会被阻塞,直到数据被读出。无缓冲 channel
是在多个 goroutine
之间同步很棒的工具。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论