【问题标题】:non-name on left side of := [duplicate]:= 左侧的非名称 [重复]
【发布时间】:2020-02-29 00:10:55
【问题描述】:

我正在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
    }
}

【问题讨论】:

    标签: go synchronization channel


    【解决方案1】:

    您使用的是“短变量声明”语法。来自language specification

    它是带有初始化表达式但没有类型的常规变量声明的简写

    ...

    与常规变量声明不同,短变量声明可以重新声明 变量,前提是它们最初是在同一个块(如果块是函数体,则为参数列表)中以相同类型声明的,并且至少有一个非空白变量是新的。

    换一种说法:您的代码尝试重新声明mysl[i]。这不符合“至少有一个非空白变量是新的”规则,因此编译器会抱怨。相反,您只想做一个赋值 - 使用 = 运算符。

    【讨论】:

    • 有点吹毛求疵:从技术上讲,mysl[i] 即使在其他正确的上下文中也不能是变量:mysl 是(复合)变量,但 mysl[i] 仅指它。
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-09-03
    • 2011-02-09
    相关资源
    最近更新 更多