切片 append 问题?
package main
import (
"fmt"
)
func main() {
arr := []int{1, 2, 3}
add(arr)
fmt.Println(arr)
}
// 这个函数不能有返回值,也不能定义全局变量, 怎么改变原切片的内容并返回
func add(arr []int) {
arr = append(arr, 10)
}
// 实际输出 [1, 2, 3]
// 期望输出 [1, 2, 3, 10]
package main
import (
“fmt”
)
func main() {
arr := []int{1, 2, 3}
add(&arr)
fmt.Println(arr)
}
// 这个函数不能有返回值,也不能定义全局变量, 怎么改变原切片的内容并返回
func add(arr *[]int) {
*arr = append(*arr, 10)
}
// 实际输出 [1, 2, 3]
// 期望输出 [1, 2, 3, 10]
方法一:用指针的方式,传递变量的地址
方法二:给函数add一个返回值
我这种有点反常,地址一样,为啥值还是 [1,2,3]
@xuanjiang 你make的容量足够大,他们底层用的同一数组,试试arr := make([]int, 0)就会发现地址不一样
不要操作变量,操作指针即可。
通过append返回的新切片,地址空间不一样了.
arr = append(arr, …), 返回的是一个新的变量地址,切片的这个特性是golang使用时需要注意的一个坑。
另外,golang参数传递使用的是值拷贝,因此,如果希望输入参数的内容被改变并返回,需要使用指针。