一直尝试去照着教程理解channel的用法和具体存在的意义。根据个人的理解,channel主要用来实现不同goroutine之间的数据同步和交互。
channel的基本知识:
channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。
ch <- v // 将 v 送入 channel ch。v := <-ch // 从 ch 接收,并且赋值给 v。
(“箭头”就是数据流的方向。)
和 map 与 slice 一样,channel 使用前必须创建:
ch := make(chan int)
默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。
代码如下:
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum // send sum 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) /*如下代码会保证等到两个routine的结果输出到C后,继续执行,从而达到同步的效果*/ x, y := <-c/*第一个channel被填充后赋值*/, <-c /*第二个channel被填充后赋值*/ fmt.Println(x, y, x+y) }
有疑问加站长微信联系(非本文作者)