结构中的Golang通道:当传递给函数时,它是否具有方向性?

结构中的Golang通道:当传递给函数时,它是否具有方向性?,go,struct,channel,channels,Go,Struct,Channel,Channels,将通道传递给函数时,我知道您可以指定通道可能使用该通道的方向;比如说, func MyFunc(ch chan<- string) { ch <- "Hello" } 然后我实例化一个结构: var slcChanStruct []ChanStruct for a:= 0; a <=2; a++ { var tmpChanStruct ChanStruct tmpChanStruct.chMessages = make(chan string)

将通道传递给函数时,我知道您可以指定通道可能使用该通道的方向;比如说,

func MyFunc(ch chan<- string) {
    ch <- "Hello"
}
然后我实例化一个结构:

var slcChanStruct []ChanStruct
for a:= 0; a <=2; a++ {
    var tmpChanStruct ChanStruct
    tmpChanStruct.chMessages = make(chan string)
    slcChanStruct = append(slcChanStruct, tmpChanStruct)
}
var slcChanStruct[]ChanStruct

对于a:=0;a根据您的具体情况,有几种方法:

  • 传递通道而不是结构,并使通道参数具有方向性,如第一个示例所示
  • 不要直接公开通道,只公开一个struct方法来写入它(如果没有方法从中读取,它实际上是定向的)
  • 使通道结构成员具有方向性:
例如

键入myStruct struct{

c chan根据@Adrian的建议,如果您必须确保频道上的单向通信,您可以始终使用匿名功能:

for a:=0; a <=2; a++{
  go func f(ch <-string) {
    SomeFunc(ch)
  }(slcChanStruct[a].chMessages)
}
最后,可以类似地修改循环:

for a:=0; a <=2; a++{
  go func f(s ChanStruct) {
    var sr ChanStructRecv
    sr.chMessages = s.chMessages
    SomeFunc(sr)
  }(slcChanStruct[a])
}

对于a:=0;a感谢您的响应!我已经考虑了第三个示例,但是如果我使结构成员具有方向性,我将如何在接收方读取它?这难道不可能吗?接收方必须保留其自己的通道副本,该副本要么不是方向性的,要么是仅接收的,与您必须保存的相同原始示例将定向通道直接传递给函数。
type myStruct struct {
    c chan <- bool
}
for a:=0; a <=2; a++{
  go func f(ch <-string) {
    SomeFunc(ch)
  }(slcChanStruct[a].chMessages)
}
type ChanStruct struct {
    chMessages chan string
}

type ChanStructRecv struct {
    chMessages <-chan string
}

// Update SomeFunc type:

func SomeFunc(s ChanStructRecv) {
  // ...
}
for a:=0; a <=2; a++{
  go func f(s ChanStruct) {
    var sr ChanStructRecv
    sr.chMessages = s.chMessages
    SomeFunc(sr)
  }(slcChanStruct[a])
}