我有一片uuid.UUID元素。從源代碼來看, auuid.UUID只是位元組陣列的型別別名:type UUID [16]byte。
我正在嘗試使用以下代碼將這片uuid.Uuids轉換為 s 片:[]byte
package main
import (
"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塊)。這僅設定最后一個元素(前兩個元素保持為零)。
uj5u.com熱心網友回復:
需要考慮的兩個事實:
id是 UUID 型別,即[16]byte.- 回圈變數 a 在每次迭代時被覆寫
因此,在 for 回圈的所有迭代之間只有一個 is 實體id被分配和共享。由于id是一個陣列(不是切片),因此每個 UUID 的內容都被復制到id. 因此,所有 slice 都id[:]指向同一個共享的底層位元組陣列,當回圈結束時,該陣列包含id.
修理:
idBytes[i] = ids[i][:]
這將為每個 UUID 創建單獨的切片。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414543.html
標籤:
