声明数组大小是否明确确定按值传递与引用传递?

时间:2020-07-18 18:06:28

标签: arrays go pass-by-reference

以数组副本不改变其父数组为例:

    a1 := [5]string{"English", "Japanese", "Spanish", "French", "Hindi"}
    a2 := a1 
    fmt.Println("a1 = ", a1) //[English Japanese Spanish French Hindi]
    fmt.Println("a2 = ", a2) //[English Japanese Spanish French Hindi]
    a2[1] = "German"
    fmt.Println("now a2 = ", a2) // [English German Spanish French Hindi]
    fmt.Println("and a1 = ", a1) // [English Japanese Spanish French Hindi]

毫不奇怪,a2是副本,而不是参考。更改副本不应更改另一个副本,它们将保留在不同的地址。

现在检查如果不将尺寸声明为a1会发生什么情况:

    a1 := []string{"English", "Japanese", "Spanish", "French", "Hindi"} // <--difference here
    a2 := a1
    fmt.Println("a1 = ", a1) //[English Japanese Spanish French Hindi]
    fmt.Println("a2 = ", a2) //[English Japanese Spanish French Hindi]
    a2[1] = "German"
    fmt.Println("now a2 = ", a2) // [English German Spanish French Hindi]
    fmt.Println("and a1 = ", a1) // [English German Spanish French Hindi]

更改a2时是否同时更改?!因此,如果您不为数组声明大小,然后将其分配给某个对象,则其突然成为引用?为什么a2:= a1的行为完全不同,这取决于声明另一个变量的方式?我很困惑,哈哈。

1 个答案:

答案 0 :(得分:1)

我强烈建议您阅读Go博客文章Arrays, slices and strings-然后再次阅读-该文章还包含许多其他细微的副作用。

它将显示引擎盖下发生的情况以及如何表示切片类型:

sliceHeader{
    Length:        0,
    Capacity:      0,
    ZerothElement: nil, // points to a fixed size array
}

以及变异操作如何影响一个以上的分片值。

最后报价:

数组有其位置-它们很好地表示了 例如转换矩阵-但它们在Go中最常见的目的 是要保留一片的存储空间。

相关问题