nc1(m1)
fmt.Println("调用 func1 后 m1 值:", m1, cap(m1))
}
func func1 (a []string) {
a = append(a, "val1")
fmt.Println("func1中:", a, cap(a))
}
输出结果如下:
调用 func1 前 m1 值: [test] 1
func1中: [test val1] 2
调用 func1 后 m1 值: [test] 1
这个结果说明,调用前后切片并没有发生变化。之前例子中所谓的“变化”其实是切片中指向数组的指针指向的数组的元素发生了变化,这句话可能比较拗口,但实际如此。再次证明,引用类型的传参不是 pass-by-reference 。
想透彻的了解 一个切片是一个数组片段的描述。它包含了指向数组的指针,片段的长度
这句话,有兴趣可以看这篇文章:http://www.2cto.com/kf/201604/499045.html。学习一下切片的内存模型。
总结
总结很简单,语言也需要透过现象看本质。还有本文的结论需要记住:
There is no pass-by-reference in Go.