gpt4 book ai didi

go - 重写 channel ,同时监听它并进行循环处理

转载 作者:IT王子 更新时间:2023-10-29 01:38:09 27 4
gpt4 key购买 nike

虽然在 channel 中尝试了一些实验,但我想出了以下代码:

var strChannel = make(chan string, 30)
var mutex = &sync.Mutex{}

func main() {

go sampleRoutine()

for i := 0; i < 10; i++ {
mutex.Lock()
strChannel <- strconv.FormatInt(int64(i), 10)
mutex.Unlock()
time.Sleep(1 * time.Second)
}

time.Sleep(10 * time.Second)
}

func sampleRoutine() {
/* A: for msg := range strChannel{*/
/* B: for {
msg := <-strChannel*/
log.Println("got message ", msg, strChannel)
if msg == "3" {
mutex.Lock()
strChannel = make(chan string, 20)
mutex.Unlock()
}
}
}

基本上,在收听给定 channel 时,我将 channel 变量分配给特定条件下的新 channel (此处为 msg == 3)。

当我使用注释 block B 中的代码时,它按预期工作,即循环移动到新创建的 channel 并打印 4-10。

但是,我认为只是编写循环的一种不同方式的注释 block A 不起作用,即在打印“3”后它停止了。

有人可以告诉我这种行为的原因吗?

还有像这样的代码,其中例程监听一个 channel ,创建一个新的安全吗?

最佳答案

在 Go 中,for 语句在循环开始之前评估 range 右侧的值。

这意味着更改 range 右侧的变量值不会产生任何影响。因此,在您的代码中,在变体 A 中,msg 不断迭代原始 channel 并且从未改变。在 Varaint B 中,它按预期工作,因为每次迭代都会评估 channel 。

这个概念有点棘手。这并不意味着您不能修改范围 右侧的slicemapitems。如果深入研究,你会发现在Go中,mapslice存储的是一个指针,修改它的item并不会改变那个指针,所以是有作用的。

array 的情况下更加棘手。修改 range 右侧的 arrayitem 没有任何效果。这是由于 Go 将数组存储为值的机制。

Playground 示例:https://play.golang.org/p/wzPfGHFYrnv

关于go - 重写 channel ,同时监听它并进行循环处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137056/

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