英文:
Range value is int
问题
我有一个需要在stopCs
上循环发送struct{}{}
消息的函数。问题是循环中的stopC
是一个int
类型。为什么会这样,我该如何修复它?
func myfunc() {
var stopCs []chan struct{}
// 将 stopC 添加到 stopCs
return func() {
for stopC := range stopCs {
stopC <- struct{}{}
}
}
}
问题出在stopCs
的类型定义上,它是一个通道(channel)的切片。在循环中,range stopCs
会返回切片中的索引,而不是通道本身。要修复这个问题,你可以将循环中的stopC
改为_
,表示忽略索引,然后通过stopCs[stopC]
来访问通道。修复后的代码如下:
func myfunc() {
var stopCs []chan struct{}
// 将 stopC 添加到 stopCs
return func() {
for _, stopC := range stopCs {
stopC <- struct{}{}
}
}
}
这样就可以正确地在stopCs
上循环发送消息了。
英文:
I have a function that needs to cycle over stopCs
sending a struct{}{}
message. Problem is the stopC
in the range is an int
. Why, and how do I fix it?
func myfunc() {
var stopCs []chan struct{}
// Append to stopCs
return func() {
for stopC := range stopCs {
stopC <- struct{}{}
}
}
答案1
得分: 2
for ... range
语句允许两种类型的赋值,第一种是你使用的方式,它遍历索引;第二种是遍历索引和值。简而言之,你应该使用以下方式:
for i, stopC := range stopCs {
而不是
for i := range stopCs {
引用规范:
> 如果最后一个迭代变量是空白标识符,那么range子句等同于没有该标识符的相同子句。
英文:
The for ... range
statement allows for two types of assignment, the
first is the one you used which iterates over the indices and the second is
the one that iterates over the indices and the values. In short, you want
for i, stopC := range stopCs {
instead of
for i := range stopCs {
To cite the spec:
> If the last iteration variable is the blank identifier, the range clause is equivalent to the same clause without that identifier.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论