为什么在忽略append结果时会出现“未使用的变量”编译错误?

问题描述 投票:0回答:1

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

#示例

 var mySlice []string

 mySlice = append(mySlice,"halo")

与地图相同的行为

#示例

var my = map[string]int{}

my["tes"]=1
go compiler-errors append unused-variables
1个回答
4
投票

规范:变量声明:

实现限制:如果从未使用过变量,编译器可能会将在函数体内声明变量视为非法。

如您所见,编译器可能接受也可能不接受未使用的变量。当前的 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 作者的意见,但这就是他们决定和实现它的方式。

© www.soinside.com 2019 - 2024. All rights reserved.