1 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
在閱讀我的答案的其余部分之前,請(qǐng)查看這個(gè) SO 答案,以獲得對(duì)切片實(shí)際是什么的真正有用的解釋。通過(guò)打印出實(shí)際的切片標(biāo)題可能更容易理解發(fā)生了什么。請(qǐng)參閱以下示例代碼(并轉(zhuǎn)到 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)
}
}
這將打印如下內(nèi)容:
&{Data:824634441776 Len:5 Cap:6}
&{Data:824634441776 Len:6 Cap:6}
&{Data:824634441776 Len:6 Cap:6}
這表明所有變量slice、slice2和slice3都指向相同的數(shù)據(jù)(Data這是指向切片第一個(gè)元素的指針)但切片標(biāo)頭本身不同。當(dāng)您執(zhí)行appends 時(shí),您正在修改所有變量共享的基礎(chǔ)切片,并將新的切片標(biāo)頭存儲(chǔ)到新變量中。slice2和的切片標(biāo)頭slice3正在查看相同的數(shù)據(jù)切片,因此當(dāng)您出現(xiàn)并執(zhí)行追加時(shí)slice3,您將覆蓋所有變量共享的基礎(chǔ)切片中的第 6 個(gè)元素。
- 1 回答
- 0 關(guān)注
- 98 瀏覽
添加回答
舉報(bào)