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

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

誰(shuí)能解釋這種附加到 golang 切片的奇怪行為

誰(shuí)能解釋這種附加到 golang 切片的奇怪行為

Go
SMILET 2021-09-10 10:53:07
下面的程序有意外的輸出。func main(){    s:=[]int{5}    s=append(s,7)    s=append(s,9)    x:=append(s,11)    y:=append(s,12)    fmt.Println(s,x,y)}輸出: [5 7 9] [5 7 9 12] [5 7 9 12]為什么是的最后一個(gè)元素x 12?
查看完整描述

2 回答

?
慕容3067478

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

切片只是數(shù)組一部分的窗口,它沒(méi)有特定的存儲(chǔ)空間。

這意味著如果在數(shù)組的同一部分有兩個(gè)切片,則兩個(gè)切片必須“包含”相同的值。

這正是這里發(fā)生的事情:

  1. 當(dāng)您執(zhí)行第一個(gè)操作時(shí)append,您將在一個(gè)大小2為基礎(chǔ)的數(shù)組上獲得一個(gè)新的大小切片2。

  2. 當(dāng)您執(zhí)行 next 時(shí)append,您將獲得一個(gè)新的大小切片,3但底層數(shù)組的大小4append通常分配的空間比立即需要的空間多,因此不需要在每次追加時(shí)分配)。

  3. 這意味著 nextappend不需要新數(shù)組。因此xy兩者都將使用與先例 slice 相同的底層數(shù)組s。你寫(xiě)11然后12在這個(gè)數(shù)組的同一個(gè)槽中,即使你得到兩個(gè)不同的切片(記住,它們只是窗口)。

您可以通過(guò)在每次 append 后打印切片的容量來(lái)檢查:

fmt.Println(cap(s))

如果你想在xand 中有不同的值y,你應(yīng)該做一個(gè)副本,例如這樣:

s := []int{5}

s = append(s, 7)

s = append(s, 9)

x := make([]int,len(s))

copy(x,s)

x = append(x, 11)

y := append(s, 12)

fmt.Println(s, x, y)

這里的另一個(gè)解決方案可能是強(qiáng)制s切片后面的數(shù)組的容量不大于所需的容量(從而確保以下兩個(gè)append 必須使用新數(shù)組):


s := []int{5}

s = append(s, 7)

s = append(s, 9)

s = s[0:len(s):len(s)]

x := append(s, 11)

y := append(s, 12)

fmt.Println(s, x, y)


查看完整回答
反對(duì) 回復(fù) 2021-09-10
?
慕運(yùn)維8079593

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

dystroy 很好地解釋了它。我喜歡為行為添加視覺(jué)解釋。


切片只是數(shù)組段的描述符。它由指向數(shù)組的指針 (ptr)、段的長(zhǎng)度 (len) 和容量 (cap) 組成。


    +-----+                                                              

    | ptr |                                                              

    |*Elem|                                                              

    +-----+                                                              

    | len |                                                              

    |int  |                                                              

    +-----+                                                              

    | cap |                                                              

    |int  |                                                              

    +-----+ 

所以,代碼的解釋如下;


func main() {                                                           

                      +                                                 

                      |                                                 

  s := []int{5}       |  s -> +-----+                                   

                      | []int | ptr +-----> +---+                       

                      |       |*int | [1]int| 5 |                       

                      |       +-----+       +---+                       

                      |       |len=1|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |       |cap=1|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |                                                 

  s = append(s,7)     |  s -> +-----+                                   

                      | []int | ptr +-----> +---+---+                   

                      |       |*int | [2]int| 5 | 7 |                   

                      |       +-----+       +---+---+                   

                      |       |len=2|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |       |cap=2|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |                                                 

  s = append(s,9)     |  s -> +-----+                                   

                      | []int | ptr +-----> +---+---+---+---+           

                      |       |*int | [4]int| 5 | 7 | 9 |   |           

                      |       +-----+       +---+---+---+---+           

                      |       |len=3|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |       |cap=4|                                   

                      |       |int  |                                   

                      |       +-----+                                   

                      |                                                 

  x := append(s,11)   |          +-------------+-----> +---+---+---+---+

                      |          |             | [4]int| 5 | 7 | 9 |11 |

                      |          |             |       +---+---+---+---+

                      |  s -> +--+--+  x -> +--+--+                     

                      | []int | ptr | []int | ptr |                     

                      |       |*int |       |*int |                     

                      |       +-----+       +-----+                     

                      |       |len=3|       |len=4|                     

                      |       |int  |       |int  |                     

                      |       +-----+       +-----+                     

                      |       |cap=4|       |cap=4|                     

                      |       |int  |       |int  |                     

                      |       +-----+       +-----+                     

                      |                                                 

  y := append(s,12)   |                        +-----> +---+---+---+---+

                      |                        | [4]int| 5 | 7 | 9 |12 |

                      |                        |       +---+---+---+---+

                      |                        |                        

                      |          +-------------+-------------+          

                      |          |             |             |          

                      |  s -> +--+--+  x -> +--+--+  y -> +--+--+       

                      | []int | ptr | []int | ptr | []int | ptr |       

                      |       |*int |       |*int |       |*int |       

                      |       +-----+       +-----+       +-----+       

                      |       |len=3|       |len=4|       |len=4|       

                      |       |int  |       |int  |       |int  |       

                      |       +-----+       +-----+       +-----+       

                      |       |cap=4|       |cap=4|       |cap=4|       

                      |       |int  |       |int  |       |int  |       

                      +       +-----+       +-----+       +-----+       

  fmt.Println(s,x,y)                                                    


查看完整回答
反對(duì) 回復(fù) 2021-09-10
  • 2 回答
  • 0 關(guān)注
  • 219 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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