我有一片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)
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这会产生以下输出:
ids: [66b4bb26-3c1f-4dd7-a608-aa8f799e4bfe 014e0537-c326-4021-be38-165f49595eed 5c71efff-ddb5-4f6e-8f85-c1dab013b5d1]
idBytes: [5c71efffddb54f6e8f85c1dab013b5d1 5c71efffddb54f6e8f85c1dab013b5d1 5c71efffddb54f6e8f85c1dab013b5d1]
Run Code Online (Sandbox Code Playgroud)
显然有 3 个不同的 UUID,但输出切片仅包含最后一个,重复了 3 次。这里发生了什么?
我尝试过的事情:
idBytes[i] = id[:]内if i == len(ids) - 1)。这仅设置最后一个元素(前两个元素保持为零)。需要考虑两个事实:
id是 UUID 类型,即[16]byte.id因此,在 for 循环的所有迭代之间只分配和共享一个 的实例。由于id是一个数组(不是切片),因此每个 UUID 的内容都会复制到id. 因此,所有切片 都id[:]指向同一个共享的底层字节数组,当循环结束时,该数组包含 的最新内容id。
修理:
idBytes[i] = ids[i][:]
Run Code Online (Sandbox Code Playgroud)
这将为每个 UUID 创建单独的切片。