golang 函數(shù)返回chan類型的操作
在閱讀kafka的golang 客戶端代碼sarama-cluster時,遇到了如下一段代碼:
// Messages returns the read channel for the messages that are returned by // the broker. // // This channel will only return if Config.Group.Mode option is set to // ConsumerModeMultiplex (default). func (c *Consumer) Messages() <-chan *sarama.ConsumerMessage { return c.messages }
對于代碼中的<-chan *sarama.ConsumerMessage產(chǎn)生了疑問,這個是什么意思呢?
經(jīng)查閱資料,得知上面返回的是一個read-only類型的channel,即只讀的管道。
驗證:
package main import ( "fmt" ) type C struct { Name string } type D struct { Id chan C } func (d *D)A() chan C { return d.Id } func main() { c := C{ Name: "test", } ch := make(chan C, 10) ch <- c d := D{ Id: ch, } r := d.A() r <- c for i:=0;i<=len(r);i++ { fmt.Printf("%v", <-r) } }
創(chuàng)建func A() chan C {}, 在調(diào)用A()后,返回值r為channel, 其仍可以寫入對象c,輸出結(jié)果為:
{test}{test} Process finished with exit code 0
package main import ( "fmt" ) type C struct { Name string } type D struct { Id chan C } func (d *D)A() <-chan C { return d.Id } func main() { c := C{ Name: "test", } ch := make(chan C, 10) ch <- c d := D{ Id: ch, } r := d.A() r <- c for i:=0;i<=len(r);i++ { fmt.Printf("%v", <-r) } }
創(chuàng)建func A() <-chan C {}, 在調(diào)用A()后,返回值r為channel, 但無法向r中寫入對象c,會報語法錯誤,輸出結(jié)果為:
# command-line-arguments .\test2.go:29:7: invalid operation: r <- c (send to receive-only type <-chan C) Compilation finished with exit code 2
同理, 如果返回類型為 chan<- type,則返回的是write-only類型的channel,即只能寫不能讀。
如何聲明和初始化單向channel
var ch1 chan<- int // 聲明ch1,只用于寫int數(shù)據(jù) var ch2 <-chan int // 聲明ch2,只用于讀int數(shù)據(jù)
ch3 := make(chan<- int, 10) // 初始化一個只寫的channel ch4 := make(<-chan int, 10) // 初始化一個只讀的chaannel
補充:golang chan<- 和 <-chan,作為函數(shù)參數(shù)時
開始時看到這個實在沒明白怎么回事
測試了下才知道原來
<-chan int 像這樣的只能接收值
chan<- int 像這樣的只能發(fā)送值
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go錯誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法
這篇文章主要介紹了Go錯誤處理之panic函數(shù)使用及捕獲,本篇探討了如何使用 panic 和 recover 來處理 Go 語言中的異常,需要的朋友可以參考下2023-03-03Go語言開發(fā)必知的一個內(nèi)存模型細(xì)節(jié)
這篇文章主要為大家介紹了Go語言開發(fā)必知的一個內(nèi)存模型細(xì)節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Go語言dolphinscheduler任務(wù)調(diào)度處理
這篇文章主要為大家介紹了Go語言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解
這篇文章主要為大家介紹了Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Golang語言使用像JAVA?Spring注解一樣的DI和AOP依賴注入實例
這篇文章主要為大家介紹了Golang語言使用像JAVA?Spring注解一樣的DI和AOP依賴注入實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10淺析go語言如何實現(xiàn)協(xié)程的搶占式調(diào)度的
go語言通過GMP模型實現(xiàn)協(xié)程并發(fā),為了避免單協(xié)程持續(xù)持有線程導(dǎo)致線程隊列中的其他協(xié)程饑餓問題,設(shè)計者提出了一個搶占式調(diào)度機制,本文會基于一個簡單的代碼示例對搶占式調(diào)度過程進行深入講解剖析2024-04-04