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 作者的意见,但这是他们决定和实施它的方式。