1 回答

TA貢獻1801條經驗 獲得超8個贊
在閱讀我的答案的其余部分之前,請查看這個 SO 答案,以獲得對切片實際是什么的真正有用的解釋。通過打印出實際的切片標題可能更容易理解發生了什么。請參閱以下示例代碼(并轉到 playground):
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
testSlice()
}
func testSlice() {
slice := make([]int, 0)
slice = append(slice, 1, 2, 3, 4, 5)
fmt.Printf("%+v\n", (*reflect.SliceHeader)(unsafe.Pointer(&slice)))
slice2 := append(slice, 1)
fmt.Printf("%+v\n", (*reflect.SliceHeader)(unsafe.Pointer(&slice2)))
slice3 := append(slice, 2)
fmt.Printf("%+v\n", (*reflect.SliceHeader)(unsafe.Pointer(&slice3)))
for _, i := range slice2 {
print(i)
}
println()
for _, i := range slice3 {
print(i)
}
}
這將打印如下內容:
&{Data:824634441776 Len:5 Cap:6}
&{Data:824634441776 Len:6 Cap:6}
&{Data:824634441776 Len:6 Cap:6}
這表明所有變量slice、slice2和slice3都指向相同的數據(Data這是指向切片第一個元素的指針)但切片標頭本身不同。當您執行appends 時,您正在修改所有變量共享的基礎切片,并將新的切片標頭存儲到新變量中。slice2和的切片標頭slice3正在查看相同的數據切片,因此當您出現并執行追加時slice3,您將覆蓋所有變量共享的基礎切片中的第 6 個元素。
- 1 回答
- 0 關注
- 99 瀏覽
添加回答
舉報