美文网首页Go
Go中slice的一些问题

Go中slice的一些问题

作者: flow__啊 | 来源:发表于2018-03-14 12:49 被阅读6次

    一边上代码,一边上问题吧~

    slice := [...]int{4, 5, 6, 7}
    slice2 := slice[:2]
    

    append 添加切片内容后,原来的slice会变成什么呢?
    slice2 = append(slice2, 0)
    slice的内容变为了 4 5 0 7
    这很容易理解,因为slice2引用了slice的地址。所以在slice2的未位加了0,就把6顶掉了。

    那么,slice2后再加2,1,3,看看slice会变成什么

    slice2 = append(slice2, 2, 1, 3) 
    //append可以连接两个slice,但是必须在slice后面加...`
    

    slice:[4 5 0 7]
    slice2:[4 5 0 2 1 3]
    为什么slice没有变化?因为slice2连接上2,1,3之后,明显超出了slice的长度4,go就会重新申请一块新的内存放入[4 5 0 2 1 3]并传给slice2。

    连接两个slice的操作如下:
    slice3 := append(slice[:], slice2...)
    slice3:[4 5 0 7 4 5 0 2 1 3]
    那如果把slice作为参数,在另一个函数中修改了slice的值,那么原来的slice值还会变么?

    func f2(slice []int){
        slice=append(slice,2,2,2,2)
    }
    f2(slice3)
    

    slice3的值依旧为:[4 5 0 7 4 5 0 2 1 3]
    在go中,大部分这种情况,只要不是传地址,都是值传递,而不是引用传递。

    相关文章

      网友评论

        本文标题:Go中slice的一些问题

        本文链接:https://www.haomeiwen.com/subject/aeiyottx.html