结构中的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])
}