为什么切片内部结构"通过引用传递"什么时候进入Go的功能?

时间:2017-01-28 17:25:58

标签: go struct slice mutable

package main

import "fmt"

func main() {

    a := SomeType{myslice: []int{1, 2, 3}, decimal: 2.33}

    for _, i := range a.myslice {
        fmt.Println(i)
    }
    fmt.Println(a.decimal)

    addOne(a)

    for _, i := range a.myslice {
        fmt.Println(i)
    }
    fmt.Println(a.decimal)

}

type SomeType struct {
    myslice []int
    decimal float32
}

func addOne(s SomeType) {
    s.myslice[0]++
    s.decimal += 1.2
}

上面代码的输出是:

1 2 3 2.33 2 2 3 2.33

即使我没有通过引用传递SomeType对象,也会在原始对象中修改myslice字段。为什么会这样?无论如何都要按值传递整个对象而不必创建原始对象的副本吗?

1 个答案:

答案 0 :(得分:2)

切片实际上并未通过引用传递;如果你在var pkdNewsFeedsrun = angular.module('pkdNewsFeeds', []);追加它,它的长度不会改变。但是切片包含到其后备数组的引用(或指针)。因此,当您复制切片时,新切片与旧切片共享相同的支持阵列。

切片在结构内部的事实并没有任何区别。如果您将addOne更改为仅采用切片而不是整个结构,则会看到相同的内容。