Golang 可变参数
Golangrest
restrange
func rest(args ...int){
  for index, val := range args {
		    args[index] = index;
  }
}
GolangGolang
func foo(args ...string){
	args[0] = "a"
}

func main(){
	names := []string{"Jon", "Henry", "Tom"}
	
  foo(names...)

	fmt.Println(names) // [a, Henry, Tom]
}

有的时候我们必须尽量的避免这种副作用,解决的方式有很多种,可以在函数内部去创建一个副本,也可以在传递参数的时候就去做处理

func foo(args ...string){
	args[0] = "a"
}

func main(){
	names := []string{"Jon", "Henry", "Tom"}
	
  foo(append([]string{}, names...)...)

	fmt.Println(names) // [Jon, Henry, Tom]
}

这样实际上是创建了一个新的切片并且把原先切片里的元素都装入了新的切片,但其实这里切片是开辟了一段新的内存,然后存放东西。所以还是创建了一个副本。

关于 append

append
slice = append(slice, "a")
appendappendappend

还是刚刚那个例子

func foo(args ...string){
	args = append(args, "b")
}

func main(){
	names := []string{"Jon", "Henry", "Tom"}

	foo(names...)

	fmt.Println(names[3]) // ["Jon", "Henry", "Tom"]
}
namesappendnamesnamesGolang