此问题已经在这里有了答案:
我正在go
中对同步机制进行一些练习/尝试。
为什么最后的for
迭代无法将缓冲的通道valchan
所保存的值分配到mysl
切片中?
错误是
./ myprog.go:28:7::=]左侧的非名称mysl [i
package main
import (
"sync"
)
const NUM_ROUTINES = 2
func sendValue(c chan string) {
c <- "HelloWorld"
}
func main() {
valchan := make(chan string, NUM_ROUTINES)
var wg sync.WaitGroup
wg.Add(NUM_ROUTINES)
for i := 0; i < NUM_ROUTINES; i++ {
go func() {
sendValue(valchan)
wg.Done()
}()
}
wg.Wait()
mysl := make([]string, 2, 2)
for i := 0; i < NUM_ROUTINES; i++ {
mysl[i] := <-valchan
}
}
您正在使用“短变量声明”语法。从language specification:
这是带有初始值设定项表达式但没有类型的常规变量声明的简写形式>
...
与常规变量声明不同,简短的变量声明可以重新声明变量,前提是它们最初是在相同类型的同一块中(或者如果该块是函数体,则在参数列表中)早先声明的类型,并且至少一个非空白变量是新变量。
不同地输入:您的代码尝试重新声明
mysl[i]
。这不符合“至少有一个非空白变量是新的”规则,因此编译器会抱怨。相反,您只想执行一个分配-使用=
运算符。