go chan
chan 类型
- <发送/写>型 chan<-
- <接收/读>型 <-chan
- 双向型 chan
chan 操作
- 构造/初始化 make()
- 关闭 close()
- 判等 ==
- <发送/写>数据 chan <- send_data
- <接收/读>数据 recv_data := <- chan
- chan 关闭或有数据,读操作不阻塞
- chan 未关闭且无数据,读操作阻塞
package main
import "fmt"
func main() {
//双向型 chan, 零值 nil
var ch chan int
//输入型 chan->
var ci chan<- int
//输出型 <-chan
var co <-chan int
//make()
cc := make(chan int)//无缓冲通道
cc = make(chan int, 10)//容量为10的通道
ch = cc
//双向型赋值给单向型正确
ci = ch
co = ch
//单向型赋值给双向型错误
//ch = ci //❌
//ch = co //❌
fmt.Println(ci, co, ch) //0xc00008c000 0xc00008c000 0xc00008c000
//可以赋值 -> 类型兼容 -> 可以判等
b1 := ch == cc
b2 := ci == nil
b3 := ch == ci
b4 := ch == co
//不可以赋值 -> 类型不兼容 -> 不可以判等
// b5 := ci == co //❌
fmt.Println(ci, co, cc, ch) //0xc00008c000 0xc00008c000 0xc00008c000 0xc00008c00
fmt.Println(b1, b2, b3, b4) //true false true true
//chan 发送/写
ch <- 1
//chan 接收/读
out := <-ch
fmt.Println(out) // 1
ch <- 1
//close(), chan 关闭
close(ch) //关闭后读操作不阻塞
//chan 关闭后,还有数据.读操作,返回 数据 和 true
out1, ok1 := <-ch
//chan 关闭后,没有数据.读操作,返回 零值 和 false
out2, ok2 := <-ch
fmt.Println(out1, ok1, out2, ok2) // 1 true 0 fals
ch = make(chan int, 0)
//chan 没关闭,无数据,读操作阻塞
out = <-ch

本文深入讲解了Go语言中chan的基本概念、类型、操作方法及注意事项,涵盖了无缓冲通道、单向通道、缓冲通道等内容,并通过实例展示了goroutine泄露的常见场景及防范措施。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



