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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang append() 什么時(shí)候創(chuàng)建一個(gè)新的切片?

Golang append() 什么時(shí)候創(chuàng)建一個(gè)新的切片?

Go
三國紛爭(zhēng) 2021-09-13 10:29:42
根據(jù)內(nèi)置的 api docs,當(dāng)原始切片的容量不夠大時(shí), append() 將重新分配并復(fù)制到新的數(shù)組塊。這是用于創(chuàng)建字母組合(在本例中為布爾值)的遞歸算法(的簡(jiǎn)化版本)。字母表的成員 (true, false) 被遞歸地添加到切片中,直到它的長(zhǎng)度正確,然后通過通道發(fā)送。package mainimport (    "fmt")func AddOption(c chan []bool, combo []bool, length int) {    if length == 0 {        fmt.Println(combo, "!")        c <- combo        return    }    var newCombo []bool    for _, ch := range []bool{true, false} {        newCombo = append(combo, ch)        AddOption(c, newCombo, length-1)    }}func main() {    c := make(chan []bool)    go func(c chan []bool) {        defer close(c)        AddOption(c, []bool{}, 4)    }(c)    for combination := range c {        fmt.Println(combination)    }}這是此代碼的操場(chǎng)鏈接。在輸出中:[true true true true] ![true true true false] ![true true true false][true true true false][true true false true] ![true true false false] ![true true false false][true true false false][true false true true] ![true false true false] ![true false true false][true false true false][true false false true] ![true false false false] ![true false false false][true false false false][false true true true] ![false true true false] ![false true true false][false true true false][false true false true] ![false true false false] ![false true false false][false true false false][false false true true] ![false false true false] ![false false true false][false false true false][false false false true] ![false false false false] ![false false false false][false false false false]以感嘆號(hào)結(jié)尾的行是從 AddOption 發(fā)送到通道的行。那些沒有出現(xiàn)在另一側(cè)(即在 main() 中)。很明顯,通過通道發(fā)送的切片在發(fā)送后發(fā)生了變化。由于AddOption在發(fā)送切片后立即返回,因此修改必須來自代碼塊var newCombo []boolfor _, ch := range []bool{true, false} {    newCombo = append(combo, ch)    AddOption(c, newCombo, length-1)}但是,根據(jù)文檔, append() 應(yīng)該返回一個(gè)新切片(cap(combo) 不夠大)。根據(jù)這個(gè)答案,發(fā)送到 AddOption 的切片描述符應(yīng)該是一個(gè)副本;這不是真的嗎?據(jù)我所知,作為 AddOption() 的第二個(gè)參數(shù)發(fā)送的值要么是指向切片描述符的指針,要么 append() 不返回新切片。
查看完整描述

3 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

您將切片、數(shù)據(jù)類型與實(shí)際表示混淆了。切片描述符由一對(duì) int 組成,一個(gè)用于 len,一個(gè)用于 cap,以及一個(gè)指向底層數(shù)據(jù)的指針。


因此, append 返回的確實(shí)是一個(gè)新切片,而傳遞給 add 選項(xiàng)的確實(shí)是切片描述符的副本。但是由于描述符有一個(gè)指向數(shù)據(jù)的指針,所以指針值(指向底層數(shù)據(jù)的地址)是相同的。


編輯:這是一個(gè)代碼片段來說明我的觀點(diǎn):


package main


import "fmt"


func main() {

    s := make([]int, 0, 5)

    s = append(s, []int{1, 2, 3, 4}...)


    a := append(s, 5)

    fmt.Println(a)


    b := append(s, 6)

    fmt.Println(b)

    fmt.Println(a)

}

如果你運(yùn)行這個(gè),你會(huì)得到:


[1 2 3 4 5]

[1 2 3 4 6]

[1 2 3 4 6]

因?yàn)榧热籹仍然有能力,都a和b共享相同的數(shù)據(jù)PTR。如果將容量更改為 4,則會(huì)打?。?/p>


[1 2 3 4 5]

[1 2 3 4 6]

[1 2 3 4 5]


查看完整回答
反對(duì) 回復(fù) 2021-09-13
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

當(dāng)append()創(chuàng)建一個(gè)新切片時(shí),它不會(huì)創(chuàng)建一個(gè)只比之前的切片大一個(gè)的切片。它實(shí)際上創(chuàng)建了一個(gè)比前一個(gè)大幾個(gè)元素的切片??纯催@個(gè)代碼:


package main


import "fmt"


func main() {

    var sl []bool


    for i := 0; i < 100; i++ {

        sl = append(sl, true)

        fmt.Println(cap(sl))

    }

}

Playground


如果您運(yùn)行此代碼,您會(huì)看到容量最初在每次分配時(shí)翻倍;對(duì)于更大的切片大小,這個(gè)策略當(dāng)然會(huì)改變。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
  • 3 回答
  • 0 關(guān)注
  • 299 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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