gpt4 book ai didi

结构 : Can it be directional when passed to a function? 中的 Golang channel

转载 作者:IT王子 更新时间:2023-10-29 00:43:31 25 4
gpt4 key购买 nike

将 channel 传递给函数时,我知道您可以指定 channel 可以使用 channel 的方向;例如,

func MyFunc(ch chan<- string) {
ch <- "Hello"
}

"ch"只能被 MyFunc 用来将字符串发送到别处的接收者,而 MyFunc 不能监听来自 ch 的消息。

为了简化为一定数量的 goroutine 创建动态数量的 channel ,我创建了一个包含 channel 的结构。

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 个结构,我可以通过对结构 slice 进行范围调整来使用 channel 单独读/写。但是当我将它们发送给 goroutines 时:

for a:=0; a <=2; a++{
go SomeFunc(slcChanStruct[a])
}

...有没有办法通过指定 goroutines 只能使用 ChanStruct.ch channel 发送来增加一点安全性?

请注意,我这样做的原因是,如果我不知道使用带 channel 的结构来并行处理一组进程(进程数作为命令行参数传递)需要多少个 channel ,则意味着我可以创建一个可以传递给任意数量的 goroutines 的 slice ,并通过遍历它们来直接单独访问它们;以前,如果我想从多个 goroutine 中单独读取,我必须创建一定数量的 channel 。我想通过指定进程只能以某种方式使用 channel 来增加一些安全性,就像我在使用单个 channel 时一样(单个 channel 意味着我可以做一些事情,比如告诉一个特定的 goroutine 退出而其他 goroutine 不会拦截它).如果我无法使用结构中的 channel 向函数添加方向性,是否有更惯用的方法来执行此操作?

最佳答案

除了@Adrian 的建议之外,如果您必须确保在 channel 上进行单向通信,您始终可以使用匿名函数:

for a:=0; a <=2; a++{
go func f(ch <-string) {
SomeFunc(ch)
}(slcChanStruct[a].chMessages)
}

请注意,您必须将 channel 传递给 SomeFunc 而不是结构。

如果您仍想在 channel 上执行双向通信,您可以将 channel 重新分配为单向类型:

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])
}

关于结构 : Can it be directional when passed to a function? 中的 Golang channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com