1.切片引用的疑问
简单的例子
func sliceModify(slice []int) {
slice = append(slice, 5)
fmt.Println("调用函数中的slice:", slice)
}
func main() {
slice := []int{1, 2, 3, 4}
sliceModify(slice)
fmt.Println("调用main中的slice:", slice)
}
输出:
调用函数中的slice: [1 2 3 4 5]
调用main中的slice: [1 2 3 4]
出现的疑问
上述例子可能就是初学者感到疑惑的点,为什么切片是引用但是最终main的结果却没发生改变。
原因很简单那就是append的问题,简单的理解就是main的切片指向A,但是在调用函数后append使用后指向B。此时main中的切片仍然指向的是A。
解决方法:
所以解决的方法如下
func sliceModify(slice *[]int) {
*slice = append(*slice, 5)
fmt.Println("调用函数中的slice:", slice)
}
func main() {
slice := []int{1, 2, 3, 4}
sliceModify(&slice)
fmt.Println("调用main中的slice:", slice)
}
2.apend中有...是什么作用
查询GPT的完整回答:
在 Go 语言中,append
函数可以用于向切片中追加元素。当在 append
函数中传入的参数是一个切片时,如果该切片的类型是 []T
,而不是 []T
中的 T
类型,那么可以使用 ...
来将这个切片打散成单个元素,然后将这些元素追加到目标切片中。
例子:
例如,假设有两个切片 slice1
和 slice2
,它们的类型都是 []int
:
slice1 := []int{1, 2, 3} slice2 := []int{4, 5, 6}
如果想将 slice2
追加到 slice1
后面,可以使用 append
函数:
slice1 = append(slice1, slice2...)
这里的 ...
将 slice2
打散成单个元素,然后将这些元素依次追加到 slice1
中。相当于执行了以下操作:
slice1 = append(slice1, 4, 5, 6)
所以最终 slice1
的值将变成 [1 2 3 4 5 6]
。