从另一个切片复制后,切片中的所有条目最终都相同
All entries in slice end up identical after copying from another slice
我有一片 uuid.UUID
个元素。从 the source 开始,uuid.UUID
只是字节数组的类型别名:type UUID [16]byte
.
我正在尝试使用以下代码将 uuid.Uuid
的这一部分转换为 []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
块中)。这仅设置最后一个元素(前两个元素保持为零)。
需要考虑的两个事实:
id
是UUID类型,即[16]byte
.
- 每次迭代都会覆盖循环变量a
因此,只有一个 id
实例在 for 循环的所有迭代之间分配和共享。由于 id
是一个数组(不是切片),每个 UUID 的内容都被复制到 id
。因此,所有切片 id[:]
都指向相同的共享底层字节数组,当循环结束时,该数组包含 id
.
的最新内容
修复:
idBytes[i] = ids[i][:]
这将为每个 UUID 创建单独的切片。
我有一片 uuid.UUID
个元素。从 the source 开始,uuid.UUID
只是字节数组的类型别名:type UUID [16]byte
.
我正在尝试使用以下代码将 uuid.Uuid
的这一部分转换为 []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
块中)。这仅设置最后一个元素(前两个元素保持为零)。
需要考虑的两个事实:
id
是UUID类型,即[16]byte
.- 每次迭代都会覆盖循环变量a
因此,只有一个 id
实例在 for 循环的所有迭代之间分配和共享。由于 id
是一个数组(不是切片),每个 UUID 的内容都被复制到 id
。因此,所有切片 id[:]
都指向相同的共享底层字节数组,当循环结束时,该数组包含 id
.
修复:
idBytes[i] = ids[i][:]
这将为每个 UUID 创建单独的切片。