关于 golang 中未使用的变量

问题描述

为什么如果我们在slice中追加数据而不使用它(程序中的变量mySlice),为什么不抛出错误信息“未使用的变量”golang。谢谢你

#example

 var mySlice []string

 mySlice = append(mySlice,"halo")

与地图相同的行为

#example

var my = map[string]int{}

my["tes"]=1

解决方法

Spec: Variable declarations:

实现限制:如果变量从未使用过,编译器可能会使其在 function body 中声明变量是非法的。

如您所见,编译器可能接受也可能不接受未使用的变量。当前的 Go 编译器通过检查变量是否被读取来实现这一点。 读取一个变量意味着该变量使用。

如果您不读取变量,则编译器会给出“未使用的变量”(或者更确切地说是“声明但未使用的”)。

例如:

var i int
i = 3

即使您在上面的示例中为 i 赋值,由于它未被读取,这是一个编译时错误。

使用 append() 附加到切片涉及读取切片(切片被传递给 append())。

为映射键分配值涉及读取映射值。

如果您不使用 append() 而是“直接”为切片元素赋值,情况也是如此:

var i = []int{0}
i[0] = 1

这是可以的,因为分配给 i[0] 涉及读取切片头以确定我们要分配给的元素(的地址)。

但是如果我们像这样分配给 i 本身:

var i = []int{0}
i = []int{1}

此作业不涉及读取 i,因此也是编译时错误。

如果我们使用结构体,例如:

type Point struct{ x,y int }

var p Point
p.x = 1

这仍然可以编译,即使赋值并不真正涉及读取 p 结构。我们可能会将其视为“识别”p.x 字段涉及访问 p 变量。

这有点“灰色地带”,基于 Go 作者的意见,但这就是他们决定和实施它的方式。