【发布时间】:2017-11-03 22:29:12
【问题描述】:
当将通道传递给函数时,我知道您可以指定通道可能使用通道的方向;例如,
func MyFunc(ch chan<- string) {
ch <- "Hello"
}
“ch”只能被 MyFunc 用来向其他地方的接收者发送字符串,而 MyFunc 不能监听来自 ch 的消息。
为了简化为一些 goroutine 创建动态数量的通道,我创建了一个包含通道的结构。
type ChanStruct struct {
chMessages chan string
}
然后我实例化一个结构体:
var slcChanStruct []ChanStruct
for a:= 0; a <=2; a++ {
var tmpChanStruct ChanStruct
tmpChanStruct.chMessages = make(chan string)
slcChanStruct = append(slcChanStruct, tmpChanStruct)
}
现在我有 3 个结构,我可以通过遍历一个结构片来单独读取/写入通道。但是当我将它们发送到 goroutines 时:
for a:=0; a <=2; a++{
go SomeFunc(slcChanStruct[a])
}
...有没有办法通过指定 goroutines 只能使用 ChanStruct.ch 通道发送来增加一点安全性?
注意我这样做的原因是,如果我不知道使用带有通道的结构体的一组并行进程(进程数作为命令行参数传递)需要多少个通道,则意味着我可以创建一个可以传递给任意数量的 goroutine 的切片,并通过遍历它们来单独访问它们;以前,如果我想从多个 goroutine 中单独读取,我必须创建一组通道。我想通过指定进程只能以某种方式使用通道来增加一些安全性,就像我在使用单个通道时一样(单个通道意味着我可以做一些事情,比如告诉一个特定的 goroutine 在没有其他 goroutine 拦截的情况下退出它)。如果我无法使用结构中的通道向函数添加方向性,是否有更惯用的方法来做到这一点?
【问题讨论】:
标签: go struct channel channels