为了账号安全,请及时绑定邮箱和手机立即绑定

从另一个切片复制后,切片中的所有条目最终都相同

从另一个切片复制后,切片中的所有条目最终都相同

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 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信