Go语言chan

Go语言chan教程

chan 是 Go 语言 中的一个核心 类型,可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。

chan 的本质是一个队列,且 chan 是线程安全的, 也就是自带 的功能。

Go语言chan详解

chan 是 goroutine 之间的通信机制,一个 chan 可以让一个 goroutine 通过它给另一个 goroutine 发送信息。每个 chan 都对应一个特殊的数据类型。

Go 语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。

声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型 和引用类型的值或者 指针

声明chan

语法

var chanName chan chanType

参数

参数 描述
var 声明变量使用的关键字。
chanName 管道变量名。
chan 声明管道变量类型使用的关键字。
chanType 管道变量的具体类型。

说明

我们声明了一个 chan 类型的 变量 ,变量名为 chanName,变量的类型为 chan chanType。注意 chanName 的变量类型为 chan chanType。

此时,chanName 的值为 nil,声明之后需要使用 make 创建完毕之后,才可以使用。

创建通道

通道是引用类型,需要使用 make 进行创建,格式如下:

chanName := make(chan chanType)

使用 make 创建一个类型为 chan chanType 的管道 chanName。

案例

创建管道

使用 make 创建管道

package main import ( "fmt" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用 make 创建一个 chan int 类型的管道 var chanInt chan int fmt.Println("chanInt =", chanInt) chanInt = make(chan int) fmt.Println("chanInt =", chanInt) }

程序运行后,控制台输出如下:

15_golang channel.png

首先,我们定义了一个 chan int 类型的管道 变量 chanInt ,接着,我们使用 print 打印该管道,发现该管道为 nil。

接着,我们使用 make 创建该管道,创建完之后,再次打印该管道,此时管道已经不是 nil,因此,我们在使用管道之前一定要先 make,后使用。

创建管道

使用 make 创建管道

package main import ( "fmt" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用 make 创建 chan string 类型的管道 chanStr := make(chan string) // 使用 make 创建 chan *int 类型的管道 chanIntPtr := make(chan *int) // 使用 make 创建 chan []byte 类型的管道 chanByte := make(chan []byte) fmt.Println("chanStr =", chanStr) fmt.Println("chanIntPtr =", chanIntPtr) fmt.Println("chanByte =", chanByte) }

程序运行后,控制台输出如下:

16_golang channel.png

我们分别使用 make 创建了 chan string、chan *int 和 chan []byte 类型的管道。

Go语言chan总结

chan 是 Go 语言中的一个核心类型,可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。

chan 的本质是一个队列,且 chan 是线程安全的, 也就是自带锁的功能。