最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

GO crifan 11766浏览 0评论

【问题】

折腾:

【已解决】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

就可以了。

转载请注明:在路上 » 【已解决】go语言中赋值出错:no new variables on left side of :=

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  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
    猪大毛8年前 (2016-10-14)回复
  2. 你这样的理解是错的 之所以不可以是因为数据类型变化了 go是允许 err := ...此处返回一个error类型的值 err := ...此处也返回一个error类型的值 但是如果 第一句误用了,返回了是一个nil,那此时err的类型就是就是nil,再到第二句去接收一个error类型,那就会造成类型不匹配,此时就是最为一个新的变量声明。所以会认为声明了两次 :=的作用本来就是 如果未声明则声明并且初始化,如果已声明则不声明直接改变值。 否则要:=干嘛
    猪大毛8年前 (2016-10-14)回复
87 queries in 0.189 seconds, using 22.19MB memory