在閱讀kafka的golang 客戶(hù)端代碼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 }
對(duì)于代碼中的-chan *sarama.ConsumerMessage產(chǎn)生了疑問(wèn),這個(gè)是什么意思呢?
經(jīng)查閱資料,得知上面返回的是一個(gè)read-only類(lèi)型的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, 其仍可以寫(xiě)入對(duì)象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, 但無(wú)法向r中寫(xiě)入對(duì)象c,會(huì)報(bào)語(yǔ)法錯(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
同理, 如果返回類(lèi)型為 chan- type,則返回的是write-only類(lèi)型的channel,即只能寫(xiě)不能讀。
如何聲明和初始化單向channel
var ch1 chan- int // 聲明ch1,只用于寫(xiě)int數(shù)據(jù)
var ch2 -chan int // 聲明ch2,只用于讀int數(shù)據(jù)
ch3 := make(chan- int, 10) // 初始化一個(gè)只寫(xiě)的channel
ch4 := make(-chan int, 10) // 初始化一個(gè)只讀的chaannel
補(bǔ)充:golang chan- 和 -chan,作為函數(shù)參數(shù)時(shí)
開(kāi)始時(shí)看到這個(gè)實(shí)在沒(méi)明白怎么回事
測(cè)試了下才知道原來(lái)
-chan int 像這樣的只能接收值
chan- int 像這樣的只能發(fā)送值
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Golang 空map和未初始化map的注意事項(xiàng)說(shuō)明
- Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset)
- Go語(yǔ)言的Channel遍歷方法詳解
- Golang 拷貝Array或Slice的操作
- 基于Go Int轉(zhuǎn)string幾種方式性能測(cè)試
- Go語(yǔ)言中break label與goto label的區(qū)別
- Go 實(shí)現(xiàn)英尺和米的簡(jiǎn)單單位換算方式