处理 no new variables on left side 的错误

在使用 Go 语言开发时,一些同学遇到 “no new variables on left side of :=” 的编译错误。 这里讲一下现象, 原因及解决办法。

错误现象

首先来看这段代码

1
2
3
4
5
6
7
8
9
10
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(1)
}
resp, err := io.Copy(os.Stdout, resp.Body)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
os.Exit(1)
}

以上代码实现的功能是简单的访问某个网页(url), 将网页的内容打印到屏幕上。

该代码段的第6行会报 “no new variables on left side of :=” 的错误。

产生错误的原因及解决方法

产生这个错误的原因,简单的说就: “:=” 符号不止有简单的赋值功能(操作),还具有变量声明的功能,因此在 “:=” 号的左边至少需要一个新的变量。

解决方法有几种:

  1. 用 “=” 好代替 “:=”

因为在这段代码中,第6行是复用了第1行声明好的变量,所以不用再使用 “:=” 来声明,直接改为:

1
_, err = io.Copy(os.Stdout, resp.Body)

注意:用的是 “=”, 同时我们用 “_” 代替了 “resp”, 因为 Go 是强类型语言, resp 已经第一行声明为 http.Response 类型,同时我们对 io.Copy 的这个返回值不感兴趣

  1. 如果需要知道 io.Copy 中输出字符的数量,可以改为:
1
count, err := io.Copy(os.Stdout, resp.Body)

这里新声明了要给变量: count

注意: 用的是 “:=”

  1. 如果对 io.Copy 的返回值都不感兴趣,也可以改为:
1
_, _ = io.Copy(os.Stdout, resp.Body)

注意: 用的是 “=”

或是更简单的:

1
io.Copy(os.Stdout, resp.Body)

本文标题:处理 no new variables on left side 的错误

文章作者:Morning Star

发布时间:2020年03月30日 - 11:03

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/golang/go-no-new-variables-on-left-side/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。