为什么如果我们在切片中追加数据而不使用它(程序中的变量 mySlice),为什么不抛出错误消息“未使用的变量”golang。谢谢你
#示例
var mySlice []string
mySlice = append(mySlice,"halo")
与地图相同的行为
#示例
var my = map[string]int{}
my["tes"]=1
实现限制:如果从未使用过变量,编译器可能会将在函数体内声明变量视为非法。
如您所见,编译器可能接受也可能不接受未使用的变量。当前的 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 作者的意见,但这就是他们决定和实现它的方式。