golang怎样推断channel已close_后端开发

channel有点类似于管道,它在goroutine同步与通信中,有着起承转合的作用,同时也是Golang完成CSP模子的症结。

golang 中大部份范例都是值范例(只要 slice / channel / map 是援用范例),读/写范例是值范例的 channel 时,假如元素 size 比较大时,应当运用指针替代,防止频仍的内存拷贝开支。

golang推断channel是不是已close的要领:

读channel的时刻推断其是不是已封闭

_,ok := <- jobs

此时假如 channel 封闭,ok 值为 false

写入channel的时刻推断其是不是已封闭

1、_,ok := <- jobs

此时假如 channel 封闭,ok 值为 false,假如 channel 没有封闭,则会遗漏一个 jobs

2、运用 select 体式格局

再建立一个 channel,叫做 timeout,假如超时往这个 channel 发送 true,在生产者发送数据给 jobs 的 channel,用 select 监听 timeout,假如超时则封闭 jobs 的 channel.

go func() {
 time.Sleep(time.Second * 3)
 timeout <- true
 }()
go func() {
 for i := 0; ; i++ {
 select {
     case <-timeout:
         close(jobs)
         return
 
     default:
         jobs <- i
         fmt.Println("produce:", i)
         }
     }
 }()

更多golang学问请关注golang教程栏目。

以上就是golang怎样推断channel已close的细致内容,更多请关注ki4网别的相干文章!

Leave A Comment