第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在 Go 中獲取切片的底層數(shù)組?

如何在 Go 中獲取切片的底層數(shù)組?

Go
泛舟湖上清波郎朗 2022-01-04 19:33:56
假設(shè)我有以下長度為 3 的整數(shù)數(shù)組:nums := [3]int{1,2,3}然后我抓住前兩個項目的切片numSlice := nums[:2]cap在這兩種情況下調(diào)用numSlice 和 nums 都會產(chǎn)生 3,并且len分別產(chǎn)生 2 和 3。如果我隨后附加到該切片 ( numSlice = append(numSlice, 10)),則底層數(shù)組 ( nums) 現(xiàn)在是[1 2 10]. cap兩者都保持為 3,因為切片的底層數(shù)組是相同的,切片的 len 現(xiàn)在為 3。但是,如果我再次附加到該切片 ( numSlice = append(numSlice, 20)),則該切片的底層數(shù)組必須更改 - 我們看到這是cap現(xiàn)在 numSlice 的兩倍并且 len 現(xiàn)在是 4 的情況。對不起,解釋過度了,只是自己走過它,但有人可以向我解釋底層數(shù)組的幕后情況以及如何獲取對新數(shù)組的引用嗎?
查看完整描述

2 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗 獲得超5個贊

首先,如果你還沒有,你應(yīng)該閱讀這篇關(guān)于 slice internals 的官方博客文章。那應(yīng)該清除一切。


現(xiàn)在訪問的底層數(shù)組,你可以使用的組合reflect和unsafe。特別是,reflect.SliceHeader 包含一個Data字段,該字段包含一個指向切片底層數(shù)組的指針。


改編自unsafe包文檔的示例:


s := []int{1, 2, 3, 4}

hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))

data := *(*[4]int)(unsafe.Pointer(hdr.Data))


查看完整回答
反對 回復(fù) 2022-01-04
?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗 獲得超6個贊

就像一個提示,回答你的第二個問題。從Go 1.17開始,你可以這樣做


(*[2]int)(numSlice)



package main


import (

    "fmt"

)


func main() {

    nums := [3]int{1, 2, 3}

    numSlice := nums[:2]

    underArr1 := (*[2]int)(numSlice)

    fmt.Println(&underArr1[0]) //0xc000016018


    numSlice = append(numSlice, 10)

    underArr2 := (*[3]int)(numSlice)

    fmt.Println(&underArr2[0]) //0xc000016018 - same

    fmt.Println(nums) // [1 2 10]


    numSlice = append(numSlice, 20)

    underArr3 := (*[3]int)(numSlice)

    fmt.Println(&underArr3[0]) //0xc000078030 - different

    fmt.Println(cap(numSlice)) // 6

}

老實說,你不必轉(zhuǎn)換為數(shù)組指針來查看地址,我只是為了回答你的第二個問題。


該行為確實是您描述的方式。當(dāng)您追加 時10,您的底層數(shù)組中仍然剩下一個字段(因為它的長度是 3,但是您的 numSlice 是 2),即使它當(dāng)前被 a 占用3,它也可以使用,并被3覆蓋10。


當(dāng)您附加 a 時20,沒有剩余的字段,因此它會創(chuàng)建一個新的底層數(shù)組(很可能有 6 個字段長,兩倍大)并將原始數(shù)組中的所有數(shù)據(jù)復(fù)制到那里,并將指針移動到該數(shù)組。


查看完整回答
反對 回復(fù) 2022-01-04
  • 2 回答
  • 0 關(guān)注
  • 467 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號