【问题标题】:About unused variable in golang关于 golang 中未使用的变量
【发布时间】:2021-06-17 09:37:07
【问题描述】:

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

#示例

 var mySlice []string

 mySlice = append(mySlice,"halo")

与地图的行为相同

#示例

var my = map[string]int{}

my["tes"]=1

【问题讨论】:

    标签: go unused-variables


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

    【讨论】:

    • 还有一个相关的规范:“实现限制:如果从不使用变量,编译器可能在函数体内声明变量是非法的。” (突出显示是我的)。所以,它确实是特定于实现的。
    • @zerkms 是的,这是真的。但是您的操场示例:&i 被传递给函数,因此编译器无法保证 i 未被读取。
    • @zerkms 我根据你的 cmets 做了一些调整。
    • 我重读了我的cmets,发现它太激进了,对不起,我不是故意粗鲁的,我很抱歉。
    • @zerkms 没有冒犯。它帮助我意识到答案需要澄清。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2022-01-23
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多