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

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

在 Go 中將數組復制到切片

在 Go 中將數組復制到切片

Go
一只甜甜圈 2022-05-18 14:40:24
請你能幫我理解從數組生成切片的工作原理。為什么 ID1 和 ID2 不一樣?    a := [2]string{"a", "b"}    b := [2]string{"c", "d"}    var z [2][2]string    z[0] = a    z[1] = b    fmt.Printf("%s\n", z)    var id [][]string    for _, t := range z {        temp := t[:]        id = append(id, temp)    }    fmt.Printf("\nid1 = %s", id)    var id2 [][]string    for _, t := range z {        temp := t        id2 = append(id2, temp[:])    }    fmt.Printf("\nid2 = %s", id2)[[A B C D]]id1 = [[cd] [cd]]id2 = [[ab] [cd]]
查看完整描述

3 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

這是有問題的分配。它不是看起來的那樣:

temp := t[:]

這里,t是一個數組和循環變量。這意味著在每次迭代中,當前數組的內容都會復制到t. 在第一次迭代中,t=[]string{"a","b"}創建一個切片以指向該數組并分配給temp。在第二次迭代t被覆蓋成為[]string{"c","d"}。此操作還會覆蓋第一個切片的內容。所以,你最終得到{{"c","d"},{"c","d"}}. 這里重要的一點是內容t被覆蓋,并t在兩個切片之間共享。


查看完整回答
反對 回復 2022-05-18
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

因為for range循環有一個迭代變量,它在每次迭代中都被重用。Spec: For statements: For statements with for 子句


由 init 語句聲明的變量在每次迭代中重復使用。


所以在你的第一個循環中:


for _, t := range z {

    temp := t[:]

    id = append(id, temp)

}

有一個t,并且您對相同的t數組進行切片,因此您附加的每個temp切片都將指向相同的后備數組,即t,并且在每次迭代中都會被覆蓋,因此其值將是最后一次迭代的值:[c d].


在你的第二個循環中:


for _, t := range z {

    temp := t

    id2 = append(id2, temp[:])

}

還有一個t迭代變量,但是你制作了它的一個副本:temp := t,然后對這個副本t進行切片,它與.


查看完整回答
反對 回復 2022-05-18
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

在第一個循環中,您要保存具有相同后備數組(即循環變量t)的切片。在第二個循環中,您使用不同的后備數組存儲切片,因為您制作了tin的副本temp。



查看完整回答
反對 回復 2022-05-18
  • 3 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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