package main
func Sample(args []string) {
args = append(args, "D", "E")
}
func main() {
args := []string{}
args = append(args, "A","B","C")
Sample(args)
for _, arg := range args {
println(arg)
}
}
比如在上面这个程序(https://play.golang.org/p/0Ch...)里,我希望Sample函数执行完成之后,args里面的结果是ABCDE,但是真实的结果是ABC。
这跟我对slice的理解不一样啊。
我试了一下,在Sample函数里是可以对里面的string做修改的,
package main
func Sample(args []string) {
args[2] = "F"
}
func main() {
args := []string{}
args = append(args, "A","B","C")
Sample(args)
for _, arg := range args {
println(arg)
}
}
上面这个程序(https://play.golang.org/p/Y81...)就把args的最后一个元素改成F了。
还是说因为string也是变长的结构,所以函数在传參的时候就把args的长度固定住了。这是什么原理啊。
会发生扩容,args的地址已经改了,内部的数组也已经变了。
但是go中只有值传递,所以外面的args还是引用前面的数组。
可以将args返回解决。