<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
執行緒之間進行通訊的時候,會因為資源的爭奪而產生竟態問題,為了保證資料交換的正確性,必須使用互斥量給記憶體進行加鎖,go語言並行的模型是CSP,提倡通過通訊共用記憶體,而不是通過共用記憶體而實現通訊,通道恰巧滿足這種需求。
channel
類似與一個佇列,滿足先進先出的規則,嚴格保證收發資料的順序,每一個通道只能通 過固定型別的資料如果通道進行大型結構體、字串的傳輸,可以將對應的指標傳進去,儘量的節省空間
//定義一個通道物件使用,其中int可以換為自己需要的型別 var a chan int //初始化只有一個位置的通道(第一個引數代表通道型別,第二個引數代表通道有幾個位置) //位置存滿後新的資料將存不進來(阻塞) a = make(chan int,1)
程式碼如下:
// 宣告一個通道 var a chan int a <- 5
程式碼如下:
//宣告一個通道型別 var a chan int fmt.Println("未初始化的通道", a) a = make(chan int) // wg.Add(1) go func(a chan int) { // defer wg.Done() for { x := <-a fmt.Println("接收到了資料:", x) } }(a)
如果通道重複關閉或者關閉一個沒有初始化的通道就會丟擲錯誤
close(a)//a為待關閉的通道
在並行函數中一次關閉通道程式碼如下:
// 互斥鎖物件 var once sync.Once //並行函數 //這個函數的目的是將a通道內資料乘以10傳送到通道b內 func f2(a <-chan int, b chan<- int) { defer wg.Done() for { x, ok := <-a if !ok { break } fmt.Println(x) b <- x * 10 } // 確保b通道只關閉一次 once.Do(func() { close(b) }) }
var b <-chan int
var b chan<- int
範例函數:
//單項通道一般做函數引數,作為一種規範防止通道混用 //此函數完成的功能是將a內的資料乘以10放入通道b內 func f2(a <-chan int, b chan<- int) { for { x, ok := <-a if !ok { break } fmt.Println(x) b <- x * 10 } }
channel | nil未初始化 | 空通道 | 滿通道 | 非空 |
---|---|---|---|---|
接收 | 阻塞 | 阻塞 | 接收值 | 接收值 |
傳送 | 阻塞 | 傳送值 | 阻塞 | 傳送值 |
關閉 | panic | 關閉成功 | 關閉成功 | 關閉成功 |
關閉後返回的資料 | panic | 返回0值 | 資料讀完後返回零值 | 資料讀完返回零值 |
注意以下情況:
在使用通道的時候,從以上表格可知有時會進入阻塞狀態,結合waitGroup,如果在主函數等待使用通道的函數執行結束,而使用通道的函數並且通道陷入阻塞狀態,如果有其他函數對其進行喚醒則不會死鎖,如果沒有其他函數可以對其進行喚醒則會丟擲死鎖異常。
總結:
通道將資料隔離在每一份通道內,在並行的情況下可以很好的使用資料,當然要熟悉通道阻塞的幾種情況,避免死鎖異常。
到此這篇關於Go語言中的通道channel詳情的文章就介紹到這了,更多相關Go語言中的通道channel內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45