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

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

從另一個切片復制后,切片中的所有條目最終都相同

從另一個切片復制后,切片中的所有條目最終都相同

Go
夢里花落0921 2022-10-24 16:16:54
我有一片uuid.UUID元素。從源代碼來看, auuid.UUID只是字節數組的類型別名:type UUID [16]byte。我正在嘗試使用以下代碼將這片uuid.Uuids轉換為 s 片:[]bytepackage mainimport (    "fmt"    "github.com/google/uuid")func main() {    ids := []uuid.UUID {        uuid.New(),        uuid.New(),        uuid.New(),    }    fmt.Printf("ids: %v\n", ids)    idBytes := make([][]byte, len(ids))    for i, id := range ids {        idBytes[i] = id[:]    }    fmt.Printf("idBytes: %x\n", idBytes)}出于某種原因,這會產生以下輸出:ids: [66b4bb26-3c1f-4dd7-a608-aa8f799e4bfe 014e0537-c326-4021-be38-165f49595eed 5c71efff-ddb5-4f6e-8f85-c1dab013b5d1] idBytes: [5c71efffddb54f6e8f85c1dab013b5d1 5c71efffddb54f6e8f85c1dab013b5d1 5c71efffddb54f6e8f85c1dab013b5d1]顯然有 3 個不同的 UUID,但輸出切片僅包含最后一個,重復 3 次。這里發生了什么?我嘗試過的事情:使用非切片類型而不是切片類型(即使用 []uint64 作為輸入和輸出而不是 []uuid.UUID 和 [][]byte)。這顯示了預期的行為(我看到 3 個不同的值而不是最后一個值重復 3 次),但它實際上并沒有解決我的問題。只設置最后一個元素(把idBytes[i] = id[:]里面的一個if i == len(ids) - 1塊)。這僅設置最后一個元素(前兩個元素保持為零)。
查看完整描述

1 回答

?
UYOU

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

需要考慮的兩個事實:

  • id是 UUID 類型,即[16]byte.

  • 循環變量 a 在每次迭代時被覆蓋

因此,在 for 循環的所有迭代之間只有一個 is 實例id被分配和共享。由于id是一個數組(不是切片),因此每個 UUID 的內容都被復制到id. 因此,所有 slice 都id[:]指向同一個共享的底層字節數組,當循環結束時,該數組包含id.

修理:

idBytes[i] = ids[i][:]

這將為每個 UUID 創建單獨的切片。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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