我在练/试验了一下,在go
同步机制。
为什么最后for
迭代无法分配由缓冲channel valchan
举行到mysl
片的价值观?
错误的是
./myprog.go:28:7: non-name mysl[i] on left side of :=
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
}
}
分析解答
您正在使用"short variable declaration"语法。从语言规范:
这是简写形式,与初始化表达式,但没有任何类型的常规变量声明
...
不同于常规的变量声明,短变量声明可以重新声明 变量提供他们最初早些时候在同一block(或参数列表,如果block是function体)与同类型声明,以及non-blank变量中的至少一个是新的。
换句话说:你的代码试图重新声明mysl[i]
。这不符合"at least one of the non-blank variables is new"规则,所以编译器会抱怨。相反,你会想要做的只有一个任务 - 使用=
操作。