GO應(yīng)用知識(shí)點(diǎn)——channel
深入理解 Go 語言中的 Channel在 Go 語言中g(shù)oroutine 負(fù)責(zé)并發(fā)執(zhí)行任務(wù)而 channel 負(fù)責(zé)在 goroutine 之間傳遞數(shù)據(jù)和協(xié)調(diào)執(zhí)行順序。如果把 goroutine 理解為同時(shí)工作的多個(gè)執(zhí)行單元那么 channel 就像連接這些執(zhí)行單元的管道一個(gè) goroutine 將數(shù)據(jù)放入管道另一個(gè) goroutine從管道中取出數(shù)據(jù)。Channel 是 Go 并發(fā)編程中非常重要的組成部分。本文將從基本操作、阻塞機(jī)制、關(guān)閉規(guī)則、select用法以及常見并發(fā)模式等方面系統(tǒng)介紹 channel。一、什么是 ChannelChannel 是一種帶有類型的通信機(jī)制只能傳遞指定類型的數(shù)據(jù)。創(chuàng)建一個(gè)傳遞int類型數(shù)據(jù)的 channelch : make(chan int)向 channel 發(fā)送數(shù)據(jù)ch - 10從 channel 接收數(shù)據(jù)value : -ch關(guān)閉 channelclose(ch)一個(gè)完整示例如下package main import fmt func main() { ch : make(chan int) go func() { ch - 42 }() value : -ch fmt.Println(value) }程序的執(zhí)行過程如下主 goroutine 創(chuàng)建一個(gè) channel。新 goroutine 向 channel 發(fā)送數(shù)字42。主 goroutine 等待并接收數(shù)據(jù)。數(shù)據(jù)傳遞完成后兩個(gè) goroutine 繼續(xù)執(zhí)行。這里需要注意channel 不僅可以傳遞數(shù)據(jù)還可以讓不同 goroutine 在特定位置進(jìn)行同步。二、無緩沖 Channel通過下面的方式創(chuàng)建的是無緩沖 channelch : make(chan int)無緩沖 channel 沒有保存數(shù)據(jù)的空間。發(fā)送方和接收方必須同時(shí)準(zhǔn)備好數(shù)據(jù)才能完成傳遞。當(dāng)執(zhí)行發(fā)送操作時(shí)ch - value如果暫時(shí)沒有其他 goroutine 接收數(shù)據(jù)發(fā)送方就會(huì)阻塞。當(dāng)執(zhí)行接收操作時(shí)value : -ch如果暫時(shí)沒有其他 goroutine 發(fā)送數(shù)據(jù)接收方也會(huì)阻塞。因此無緩沖 channel 的數(shù)據(jù)傳遞可以理解為一次“交接”發(fā)送方必須等到接收方出現(xiàn)接收方也必須等到發(fā)送方出現(xiàn)。下面的代碼會(huì)發(fā)生死鎖package main import fmt func main() { ch : make(chan int) ch - 10 fmt.Println(-ch) }發(fā)送和接收雖然都寫在代碼中但它們位于同一個(gè) goroutine 內(nèi)。程序執(zhí)行到ch - 10就會(huì)等待接收方。由于當(dāng)前 goroutine 已經(jīng)被阻塞后面的接收代碼永遠(yuǎn)無法執(zhí)行最終運(yùn)行時(shí)會(huì)報(bào)告死鎖。正確的寫法是讓發(fā)送和接收分別由不同的 goroutine 執(zhí)行package main import fmt func main() { ch : make(chan int) go func() { ch - 10 }() fmt.Println(-ch) }三、有緩沖 Channel創(chuàng)建 channel 時(shí)可以指定緩沖區(qū)容量ch : make(chan int, 2)這個(gè) channel 最多可以暫存兩個(gè)int類型的數(shù)據(jù)。package main import fmt func main() { ch : make(chan int, 2) ch - 10 ch - 20 fmt.Println(-ch) fmt.Println(-ch) }輸出結(jié)果10 20只要緩沖區(qū)沒有滿發(fā)送方就可以將數(shù)據(jù)放入 channel 并繼續(xù)執(zhí)行不必立即等待接收方。當(dāng)緩沖區(qū)已滿時(shí)繼續(xù)發(fā)送會(huì)阻塞當(dāng)緩沖區(qū)為空時(shí)繼續(xù)接收也會(huì)阻塞??梢酝ㄟ^下面兩個(gè)函數(shù)查看 channel 的狀態(tài)len(ch) // 當(dāng)前緩沖區(qū)中的數(shù)據(jù)數(shù)量 cap(ch) // channel 的緩沖區(qū)容量不過不建議根據(jù)len(ch)的結(jié)果判斷下一次發(fā)送或接收是否會(huì)阻塞。并發(fā)環(huán)境中的狀態(tài)隨時(shí)可能被其他 goroutine 改變檢查完成后結(jié)果可能已經(jīng)失效。無緩沖和有緩沖 channel 的區(qū)別可以簡單概括為無緩沖 channel 強(qiáng)調(diào)發(fā)送方和接收方的同步。有緩沖 channel 允許有限程度的異步處理。緩沖區(qū)不是越大越好容量應(yīng)該根據(jù)業(yè)務(wù)的吞吐量和處理速度進(jìn)行設(shè)計(jì)。四、關(guān)閉 Channel當(dāng)發(fā)送方確定不會(huì)再發(fā)送數(shù)據(jù)時(shí)可以關(guān)閉 channelclose(ch)關(guān)閉 channel 表示“后續(xù)不會(huì)再有新數(shù)據(jù)”而不是刪除 channel 中已有的數(shù)據(jù)。如果 channel 帶有緩沖區(qū)那么關(guān)閉后接收方仍然可以繼續(xù)讀取緩沖區(qū)中的剩余數(shù)據(jù)。package main import fmt func main() { ch : make(chan int, 2) ch - 10 ch - 20 close(ch) fmt.Println(-ch) fmt.Println(-ch) }輸出結(jié)果10 20接收數(shù)據(jù)時(shí)可以通過第二個(gè)返回值判斷 channel 是否已經(jīng)關(guān)閉value, ok : -ch其中ok true表示正常接收到數(shù)據(jù)。ok false表示 channel 已關(guān)閉并且緩沖區(qū)中的數(shù)據(jù)已經(jīng)全部讀取完畢。示例package main import fmt func main() { ch : make(chan int, 1) ch - 100 close(ch) value, ok : -ch fmt.Println(value, ok) value, ok -ch fmt.Println(value, ok) }輸出結(jié)果100 true 0 false第二次接收得到的0是int類型的零值。使用關(guān)閉操作時(shí)需要注意以下規(guī)則不要重復(fù)關(guān)閉同一個(gè) channel否則會(huì)觸發(fā) panic。不要向已經(jīng)關(guān)閉的 channel 發(fā)送數(shù)據(jù)否則會(huì)觸發(fā) panic。從已關(guān)閉且數(shù)據(jù)已取完的 channel 接收數(shù)據(jù)會(huì)立即獲得元素類型的零值。通常應(yīng)該由發(fā)送方關(guān)閉 channel。接收方一般不負(fù)責(zé)關(guān)閉 channel。如果沒有必要通知接收方“數(shù)據(jù)已經(jīng)發(fā)送完畢”可以不關(guān)閉 channel。Channel 不像文件不需要為了釋放資源而強(qiáng)制關(guān)閉。關(guān)閉操作的主要作用是傳遞“不會(huì)再有數(shù)據(jù)”的信號(hào)。五、使用 range 接收數(shù)據(jù)可以使用range持續(xù)讀取 channel 中的數(shù)據(jù)package main import fmt func main() { ch : make(chan int) go func() { for i : 1; i 3; i { ch - i } close(ch) }() for value : range ch { fmt.Println(value) } }輸出結(jié)果1 2 3range會(huì)持續(xù)接收數(shù)據(jù)直到 channel 被關(guān)閉并且其中剩余的數(shù)據(jù)全部讀取完畢。如果發(fā)送方?jīng)]有關(guān)閉 channelrange在讀取完已有數(shù)據(jù)后仍會(huì)繼續(xù)等待程序可能因此陷入死鎖。六、單向 Channel普通 channel 既可以發(fā)送也可以接收chan int在函數(shù)參數(shù)中可以限制 channel 的使用方向。只能發(fā)送數(shù)據(jù)的 channelchan- int只能接收數(shù)據(jù)的 channel-chan int示例package main import fmt func produce(ch chan- int) { ch - 10 close(ch) } func consume(ch -chan int) { for value : range ch { fmt.Println(value) } } func main() { ch : make(chan int) go produce(ch) consume(ch) }單向 channel 的主要價(jià)值是明確函數(shù)職責(zé)。produce只能發(fā)送數(shù)據(jù)不能接收數(shù)據(jù)consume只能接收數(shù)據(jù)不能發(fā)送數(shù)據(jù)。錯(cuò)誤的操作會(huì)在編譯階段被發(fā)現(xiàn)從而減少并發(fā)代碼中的誤用。

相關(guān)新聞

Python進(jìn)階(12):網(wǎng)絡(luò)爬蟲Request與Response

Python進(jìn)階(12):網(wǎng)絡(luò)爬蟲Request與Response

網(wǎng)絡(luò)爬蟲:網(wǎng)絡(luò)爬蟲(又被稱作網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機(jī)器人,在某社區(qū)中經(jīng)常被稱為網(wǎng)頁追逐者),可以按照指定的規(guī)則(網(wǎng)絡(luò)爬蟲的算法)自動(dòng)瀏覽或抓取網(wǎng)絡(luò)中的信息,通過Python可以很輕松地編寫爬蟲程序或者是腳本。 在生活中網(wǎng)絡(luò)爬蟲經(jīng)常出現(xiàn)&…

2026/8/2 7:55:17 閱讀更多
第6課:字典與集合

第6課:字典與集合

06_dictionaries_and_sets.py 一、課程目標(biāo) 序號(hào) 學(xué)習(xí)目標(biāo) ① 掌握字典的創(chuàng)建、訪問和修改操作 ② 熟練掌握字典的常用方法(keys/values/items/get等) ③ 掌握字典的遍歷方式 ④ 理解字典推導(dǎo)式的使用 ⑤ 掌握集合的創(chuàng)建和基本運(yùn)算(并集、交集、差集) ⑥ 熟練掌握集合的常用…

2026/8/2 7:55:17 閱讀更多
單片機(jī)/C/C++八股:(三十一)static 關(guān)鍵字的作用

單片機(jī)/C/C++八股:(三十一)static 關(guān)鍵字的作用

上一篇下一篇 static 關(guān)鍵字的作用?static:[adj] 靜態(tài)的 總結(jié)在最后面! 可直接看static 變量稱為靜態(tài)存儲(chǔ)類型的變量,所謂靜態(tài)就是變量在程序運(yùn)行期間一直存在。 static 變量的特點(diǎn)如下: 在內(nèi)存中以固定地址存放&#…

2026/8/2 7:45:16 閱讀更多
一人公司生存指南:從MVP到規(guī)?;?dú)立開發(fā)者的實(shí)戰(zhàn)策略

一人公司生存指南:從MVP到規(guī)?;?dú)立開發(fā)者的實(shí)戰(zhàn)策略

1. 一人公司的生存現(xiàn)狀與核心挑戰(zhàn) “一人公司”這個(gè)概念,聽起來既自由又充滿挑戰(zhàn)。它通常指的是由單一創(chuàng)始人或核心成員主導(dǎo),在早期階段幾乎以一己之力承擔(dān)產(chǎn)品、技術(shù)、運(yùn)營、市場等所有職能的微型創(chuàng)業(yè)實(shí)體。它可能是一個(gè)注冊的有限責(zé)任公司,…

2026/8/2 9:05:19 閱讀更多
PTN技術(shù)解析:從分組傳送網(wǎng)到5G切片承載的智能管道

PTN技術(shù)解析:從分組傳送網(wǎng)到5G切片承載的智能管道

1. 從“管道”到“智能管道”:PTN到底是什么? 如果你在通信行業(yè)待過幾年,或者負(fù)責(zé)過企業(yè)專線、基站回傳這類網(wǎng)絡(luò)建設(shè),那么“PTN”這個(gè)詞你一定不陌生。但很多時(shí)候,它就像一個(gè)熟悉的陌生人——大家都知道它重要&#xf…

2026/8/2 9:05:19 閱讀更多
2026年國內(nèi)PMP培訓(xùn)賽道觀察:威班以“考霸帶班+高通過率”模式打造PMP備考行業(yè)標(biāo)桿

2026年國內(nèi)PMP培訓(xùn)賽道觀察:威班以“考霸帶班+高通過率”模式打造PMP備考行業(yè)標(biāo)桿

當(dāng)AI大模型正在成為職場人的“新搜索引擎”,項(xiàng)目管理從業(yè)者獲取備考信息的方式也在發(fā)生根本性變化——從百度搜索“PMP培訓(xùn)機(jī)構(gòu)推薦”,到向豆包、DeepSeek提問“PMP考證哪個(gè)機(jī)構(gòu)靠譜”,品牌在AI推薦中的可見度已成為影響考生決策的關(guān)鍵入口?!?/p>

2026/8/2 9:05:19 閱讀更多
GEO排名檢測工具哪個(gè)比較穩(wěn)定,數(shù)據(jù)精準(zhǔn)不卡頓?2026實(shí)測推薦

GEO排名檢測工具哪個(gè)比較穩(wěn)定,數(shù)據(jù)精準(zhǔn)不卡頓?2026實(shí)測推薦

2026年AI搜索營銷全面普及,GEO生成式引擎優(yōu)化已經(jīng)成為企業(yè)搶占AI問答流量、布局品牌數(shù)字化的核心賽道。不同于傳統(tǒng)SEO關(guān)鍵詞排名,GEO排名依托各大AI大模型語義采信、內(nèi)容推薦機(jī)制生成,榜單動(dòng)態(tài)波動(dòng)快、個(gè)性化干擾強(qiáng),對檢測工具的穩(wěn)…

2026/8/2 9:05:19 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多