登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-10 22:15:36 467浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《声明数组大小是否明确确定按值传递与引用传递?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

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

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 的行为会根据另一个变量的声明方式而完全不同?我很困惑哈哈。


解决方案


我强烈建议阅读 go 博客文章 Arrays, slices and strings - 然后再读一遍 - 它充满了许多其他微妙的副作用。

它将显示幕后发生的事情以及切片类型的表示方式:

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

以及变异操作如何影响多个切片值。

最终报价:

数组有其用武之地——它们是 例如,转换矩阵——但它们在 go 中最常见的用途 是为切片保存存储。

以上就是《声明数组大小是否明确确定按值传递与引用传递?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>