golang 函數(shù)返回chan類型的操作
在閱讀kafka的golang 客戶端代碼sarama-cluster時(shí),遇到了如下一段代碼:
// 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)生了疑問,這個(gè)是什么意思呢?
經(jīng)查閱資料,得知上面返回的是一個(gè)read-only類型的channel,即只讀的管道。
驗(yàn)證:
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,會報(bào)語法錯(cuò)誤,輸出結(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) // 初始化一個(gè)只寫的channel ch4 := make(<-chan int, 10) // 初始化一個(gè)只讀的chaannel
補(bǔ)充:golang chan<- 和 <-chan,作為函數(shù)參數(shù)時(shí)
開始時(shí)看到這個(gè)實(shí)在沒明白怎么回事
測試了下才知道原來
<-chan int 像這樣的只能接收值
chan<- int 像這樣的只能發(fā)送值
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
go語言實(shí)現(xiàn)一個(gè)簡單的http客戶端抓取遠(yuǎn)程url的方法
這篇文章主要介紹了go語言實(shí)現(xiàn)一個(gè)簡單的http客戶端抓取遠(yuǎn)程url的方法,實(shí)例分析了Go語言http操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
Golang中的select語句及其應(yīng)用實(shí)例
本文將介紹Golang中的select語句的使用方法和作用,并通過代碼示例展示其在并發(fā)編程中的實(shí)際應(yīng)用,此外,還提供了一些與select相關(guān)的面試題,幫助讀者更好地理解和應(yīng)用select語句2023-12-12
pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)
本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Go語言計(jì)算兩個(gè)經(jīng)度和緯度之間距離的方法
這篇文章主要介紹了Go語言計(jì)算兩個(gè)經(jīng)度和緯度之間距離的方法,涉及Go語言相關(guān)數(shù)學(xué)函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng)
本文主要介紹了Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

