gpt4 book ai didi

go - 在 go channel 上选择内部范围

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:23 24 4
gpt4 key购买 nike

我正在关注 this post并行化我的应用程序。我需要定制这段代码:

func sq(done <-chan struct{}, in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for n := range in {
select {
case out <- n * n:
case <-done:
return
}
}
}()
return out
}

我不完全理解 case out <- n * n: 这行.我可以看到它说如果 n 有一个值,然后将其平方并发送到 channel 中,但我不明白为什么。是否select只拿第一个true案件?是否可以改写:

for n := range in {
select {
case n:
out <- n * n
case <-done:
return
}
}

无论如何,我需要替换行 case out <- n * n:通过函数调用。我已将其更改为以下内容:

out := make(chan structs.Ticket)

go func() {
defer close(out)
for url := range inputChannel {
select {
case url:
data, err := GetData(url)
fmt.Println("Got error: ", err)
out <- data
case <-done:
return
}
}
}()

return out

看起来这会编译(我还不能编译它),但是因为调试并行代码并不简单我想使用 case url 来检查它是在 range 中选择 channel 的正确方法.这样对吗?

更新

好的,我已经删除了代码中的剩余问题,现在当我尝试编译时,我收到了错误消息:

url evaluated but not used
select case must be receive, send or assign recv

最佳答案

  1. 是否在 range 中对 select 在这里执行的操作没有任何影响。

  2. 不,select 不采用第一个真表达式...它根本不采用表达式。唯一可以作为表达式的情况出现的是 channel 发送、 channel 接收和右侧带有 channel 接收的分配。

    select {
    case out <- n * n:
    case <-done:
    return
    }

说“如果发送 out 是可能的(即它有剩余容量或一个活跃的读者),然后发送值 n * n 给它并继续。如果从 done 接收是可能的,从函数返回。如果两者都可能,则随机选择一个并执行。如果两者都不可能,请等待其中一个成为可能。” (参见规范中的 Select Statements)。

如果需要计算您要发送的值(并且它太复杂而无法放在 channel 发送的右侧),只需在 select 之前执行即可。规范清楚地表明,select 中发送语句中的所有表达式都是提前计算的,因此不会丢失任何内容。

关于go - 在 go channel 上选择内部范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46133127/

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