关于 golang 中未使用的变量
About unused variable in golang
为什么如果我们在slice中追加数据而不使用它(程序中的变量mySlice),为什么不抛出“unused variable”的错误信息golang。谢谢
#例子
var mySlice []string
mySlice = append(mySlice,"halo")
与地图相同的行为
#例子
var my = map[string]int{}
my["tes"]=1
Implementation restriction: A compiler may make it illegal to declare a variable inside a function body if the variable is never used.
如您所见,编译器可能接受也可能不接受未使用的变量。当前的 Go 编译器通过检查变量是否被读取来实现这一点。 读取一个变量表示变量被使用。
如果您不读取变量,编译器会给出“未使用的变量”(或者更确切地说是“已声明但未使用”)。
例如:
var i int
i = 3
即使您在上面的示例中为 i
赋值,但由于未读取它,因此这是一个 compile-time 错误。
使用 append()
附加到切片涉及读取切片(切片传递给 append()
)。
为映射键赋值涉及读取映射值。
如果您不使用 append()
而是“直接”为切片元素赋值,则同样如此:
var i = []int{0}
i[0] = 1
这没关系,因为分配给 i[0]
涉及读取切片 header 以确定我们分配给的元素(的地址)。
但是如果我们像这样分配给 i
本身:
var i = []int{0}
i = []int{1}
这个作业不涉及读取 i
所以它也是一个 compile-time 错误。
如果我们要使用一个结构,例如:
type Point struct{ x, y int }
var p Point
p.x = 1
这仍然可以编译,即使赋值并不真正涉及读取 p
结构。我们可以将其视为“识别”p.x
字段涉及访问 p
变量。
这有点“灰色地带”,是基于 Go 作者的意见,但这是他们决定和实施的方式。
为什么如果我们在slice中追加数据而不使用它(程序中的变量mySlice),为什么不抛出“unused variable”的错误信息golang。谢谢
#例子
var mySlice []string
mySlice = append(mySlice,"halo")
与地图相同的行为
#例子
var my = map[string]int{}
my["tes"]=1
Implementation restriction: A compiler may make it illegal to declare a variable inside a function body if the variable is never used.
如您所见,编译器可能接受也可能不接受未使用的变量。当前的 Go 编译器通过检查变量是否被读取来实现这一点。 读取一个变量表示变量被使用。
如果您不读取变量,编译器会给出“未使用的变量”(或者更确切地说是“已声明但未使用”)。
例如:
var i int
i = 3
即使您在上面的示例中为 i
赋值,但由于未读取它,因此这是一个 compile-time 错误。
使用 append()
附加到切片涉及读取切片(切片传递给 append()
)。
为映射键赋值涉及读取映射值。
如果您不使用 append()
而是“直接”为切片元素赋值,则同样如此:
var i = []int{0}
i[0] = 1
这没关系,因为分配给 i[0]
涉及读取切片 header 以确定我们分配给的元素(的地址)。
但是如果我们像这样分配给 i
本身:
var i = []int{0}
i = []int{1}
这个作业不涉及读取 i
所以它也是一个 compile-time 错误。
如果我们要使用一个结构,例如:
type Point struct{ x, y int }
var p Point
p.x = 1
这仍然可以编译,即使赋值并不真正涉及读取 p
结构。我们可以将其视为“识别”p.x
字段涉及访问 p
变量。
这有点“灰色地带”,是基于 Go 作者的意见,但这是他们决定和实施的方式。