【已解决】go语言中赋值出错:no new variables on left side of :=

【问题】

折腾:

【已解决】go语言中获得控制台输入的字符串

期间,通过fmt.Scanf获得值,结果用如下代码:

        _, err := fmt.Scanf("%s", &strBaiduUsername)
        gLogger.Info("strBaiduUsername=%s", strBaiduUsername)
        _, err := fmt.Scanf("%s", &strBaiduPassword)
        gLogger.Info("strBaiduPassword=%s", strBaiduPassword)

却出错:

E:\Dev_Root\go\src\EmulateLoginBaidu>go run EmulateLoginBaidu.go
# command-line-arguments
.\EmulateLoginBaidu.go:297: no new variables on left side of :=

如图:

no new variables on left side of

即:

no new variables on left side of :=

【解决过程】

1.后来自己随便改为:

        _, err1 := fmt.Scanf("%s", &strBaiduUsername)
        gLogger.Info("strBaiduUsername=%s", strBaiduUsername)
        _, err2 := fmt.Scanf("%s", &strBaiduPassword)
        gLogger.Info("strBaiduPassword=%s", strBaiduPassword)

的确也是可以了。

当然,会有另外的错误提示:

E:\Dev_Root\go\src\EmulateLoginBaidu>go run EmulateLoginBaidu.go
# command-line-arguments
.\EmulateLoginBaidu.go:295: err1 declared and not used
.\EmulateLoginBaidu.go:297: err2 declared and not used

但对于上述错误,不太理解。

2.参考:

Go语言中的变量声明和赋值

看到:

i := 1
i := 2 //这个是不允许的

:= 表示声明和赋值,所以是不允许的,运行后系统会提示:no new variables on left side of :=

才想起来:

xxx := yyy

表示声明并且赋值yyy给xxx

而此处的两个:

err := someFunc()

表示声明并且赋值了两次err

而对于同一个变量,声明两次,这本身在任何语言中,都会出错的。

所以,此处的错误,也是可以理解的了。

所以,上述改为err1和err2,就不存在此错误提示了。

 

【总结】

go代码中,出现:

no new variables on left side of :=

的错误时,

原因是:

估计是用了

xxx := yyy

多次,而就相当于:

声明了多次的xxx(且赋值了多次的yyy)

这样的话,就是:

对同名的xxx变量,声明多次,所以必然出错;

 

解决办法是:

改名,比如:

xxx1 := yyy

xxx2 = yyy

就可以了。



2 Thoughts on “【已解决】go语言中赋值出错:no new variables on left side of :=

  1. 我查了一下,我说的也有错,以下正解: 复制的

    这里有一个比较微妙的地方:简短变量声明左边的变量可能并不是全部都是刚刚声明的。如果有一些已经在相同的词法域声明过了(§2.7),那么简短变量声明语句对这些已经声明过的变量就只有赋值行为了。

    在下面的代码中,第一个语句声明了in和err两个变量。在第二个语句只声明了out一个变量,然后对已经声明的err进行了赋值操作。

    in, err := os.Open(infile)
    // …
    out, err := os.Create(outfile)
    简短变量声明语句中必须至少要声明一个新的变量,下面的代码将不能编译通过:

    f, err := os.Open(infile)
    // …
    f, err := os.Create(outfile) // compile error: no new variables

  2. 你这样的理解是错的
    之所以不可以是因为数据类型变化了
    go是允许
    err := …此处返回一个error类型的值
    err := …此处也返回一个error类型的值

    但是如果 第一句误用了,返回了是一个nil,那此时err的类型就是就是nil,再到第二句去接收一个error类型,那就会造成类型不匹配,此时就是最为一个新的变量声明。所以会认为声明了两次

    :=的作用本来就是 如果未声明则声明并且初始化,如果已声明则不声明直接改变值。
    否则要:=干嘛

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量