8. Go Channel的使用

Go Channel

在Go中,多个goroutines推荐使用channel来进行通信。使用channel来共享内存。

go中channel有三种类型:读写channel, 只读channel只写的channel

默认为读写的channel:

1
c := make(chan int)

同时channel还可以有缓存。定义如下:

1
c := make(chan int, 2)

上述定义了带有2个元素缓存的,channel

一般只读或只写的channel,大多出现在函数传参中,当然也可以直接定义:

1
2
c1 := make(<-chan int) // 定义了一个只读的channel
c2 := make(chan <-int) // 定义了一个只写的channel

注意:

  • 对于缓存的channel,写数据也是阻塞的,直到将channel中的数据读出;读也是阻塞的,直到channel中有数据可读

    1
    2
    3
    4
    5
    6
    7
    8
    9
    func main() {
    c := make(chan bool)
    go func() {
    fmt.Println("Go GO Go !!")
    c <- true
    }()

    <- c // 等待读取数据,
    }
  • 对于带缓存的channel,在使用时,一定要注意如下情况:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 下面这种情况,需要注意,channel是否有缓存
    // 否则在实际的开发中,很有可能goroutines还没有执行
    // 程序就结束了。
    func main() {

    //c := make(chan bool, 1)
    c := make(chan bool)
    go func() {
    fmt.Println("Go GO Go !!")
    <- c
    }()

    // 对于无缓存时,如果没有读取channle中的数据,写也是阻塞的,必须将数据
    // 读取了之后,才能退出

    // 对于有缓存的channel,我把数据写进去就是,不管你是否读取。
    c <- true
    }

判断channel是否关闭

判断channnel是否关闭,是在接收channel的数据时候,判断的:

1
v, ok := <-c // 如果channel关闭了,ok = false

特别在for range循环遍历channel时,必须使用Close()函数关闭channnel,表示结束数据的写入,同时for循环也终止。

# Go
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×