1. 程式人生 > 其它 >go基礎知識-通道(channel)

go基礎知識-通道(channel)

1.channel:go特殊的資料型別,用於通訊,使用的時候需要注意下結合使用不當容易造成死鎖,在結合 for select 裡使用break是沒效果的

2.語法定義: <-chan 讀取, chan<-寫入

var chA = make(chan Type,len)//有緩衝

var chB = make(chan Type)//無緩衝

從無緩衝的 channel 中讀取訊息會阻塞,直到有 goroutine 向該 channel 中傳送訊息; 同理,向無快取的 channel 中傳送訊息也會阻塞,直到有 goroutine 從 channel 中讀取訊息

案例:

func main(){

var chA = make(chan int)
go func(chTemp <-chan int) {
for{
select {
//如果通道關閉則ok為false
case b,ok := <- chTemp:
if ok {
fmt.Println(b)
}else {
goto End
}
//default: //如果沒有default字句,select將阻塞,直到某個通訊可以執行
// fmt.Println("default")
}
}
End: fmt.Println("end")
}(chA)


//或者

//for v := range chA{
//   fmt.Println(v)
//}


go func(chTemp chan<- int){
for i:=0;i<10;i++ {
chTemp <- i
}
    close(chTemp)
}(chA)

time.Sleep(3 * 1e9)

}

結果輸出:0,1,2,3,4,5,6,7,8,9