协程
Do not communicate by sharing memory;
share memory by communicating.goroutine 不共享状态,
用 channel 把数据在 goroutine 之间传递。
goroutine 是 Go 的轻量级线程(lightweight thread),运行时调度的函数执行单元。
由 Go 运行时调度,不直接映射到 OS 线程。
go
func sayHello(name string) {
fmt.Println("Hello,", name)
}
func main() {
go sayHello("Alice") // 在新的 goroutine 中执行
fmt.Println("Main function")
}channel / 信道
信道是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值。
go
ch := make(chan int)
go func() {
ch <- 42 // 发送数据到 channel
}()
val := <-ch // 接收数据
fmt.Println(val)普通 channel “发”与“收”都会阻塞。
关闭 channel :
go
close(ch)close 在 for 的时候很重要,如果没有主动关闭,for 可能会一直执行下去。
带缓冲的信道
go
ch := make(chan int, 2) // 缓冲区容量是 2发送方可以先发送 N 条数据(N = 缓冲区容量),不阻塞
缓冲区满了,才会阻塞