亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

去切片覆蓋

去切片覆蓋

Go
皈依舞 2022-11-23 19:18:00
這是源代碼:package mainfunc main() {    testSlice()}func testSlice() {    slice := make([]int, 0)    //slice = append(slice, 1)  ①    //slice = append(slice, 1, 2)  ②    //slice = append(slice, 1, 2, 3)  ③    //slice = append(slice, 1, 2, 3, 4)  ④    slice = append(slice, 1, 2, 3, 4, 5)  ⑤    //slice = append(slice, 1, 2, 3, 4, 5, 6)  ⑥    slice2 := append(slice, 1)    slice3 := append(slice, 2)    for _, i := range slice2 {        print(i)    }    println()    for _, i := range slice3 {        print(i)    }}預期輸出:123451123452實際輸出:123452123452除⑤外,①~⑥的輸出符合預期。但為什么⑤會slice3覆蓋slice2?原因與指針或切片調整大小有關嗎?
查看完整描述

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 個元素。


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號