一、channel
在 Go 语言里,不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以及消除竞争状态,还可以使用 channel,通过发送和接收需要共享的资源,在 goroutine 之间做同步。
当一个资源需要在 goroutine 之间共享时,channel 在 goroutine 之间架起了一通道,并提供了确保同步交换数据的机制。声明 channel时,需要指定将要被共享的数据的类型。可以通过 channel 共享内置类型、命名类型、结构类型和引用类型的值或者指针。
基本使用:
func main() { // 使用 make 创建 channel // 方式1 var intChan chan int intChan = make(chan int, 3) // 方式2 // intChan := make(chan int, 3) fmt.Printf("aChan的值:%v\n", intChan) // 0xc000086000 fmt.Printf("aChan本身的地址:%p\n", &intChan) // 0xc000080018 // 向管道发送值(注意给channel放入数据时,不能超过其容量) intChan <- 10 intChan <- 20 fmt.Printf("aChan的len:%v\n", len(intChan)) // 2 fmt.Printf("aChan的cap:%v\n", cap(intChan)) // 3 // 从管道中读取数据 int1 := <-intChan int2 := <-intChan fmt.Println(int1, int2) // 10 20 }
1