我在练/试验了一下,在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"规则,所以编译器会抱怨。相反,你会想要做的只有一个任务 - 使用=操作。