gpt4 book ai didi

go - 只有标签不同的相同结构类型之间的不安全转换

转载 作者:IT王子 更新时间:2023-10-29 01:10:31 25 4
gpt4 key购买 nike

考虑两种结构相同但标签不同的类型:

type Foo struct {
Id int64 `json:"-"`
}

type Bar struct {
Id int64 `json:"id"`
}

不幸的是,当两种类型的标签不同并且有充分的理由时,Go 的习惯用法禁止在两种类型之间进行转换。但是,我仍然需要能够控制序列化为 JSON 的数据,并且不想使用 interface{} 类型。

我的问题是,使用 golang 的 unsafe.Pointer 在结构相同(但标签不同)的两种类型之间执行转换有多安全?像这样的东西:

rf := &Foo{1}
rb := (*Bar)(unsafe.Pointer(rf))

是否有任何可能会发生 panic ,可能是因为在内部,由于标签不同,两种类型中的每一种数据的保存方式都略有不同关于与实际类型数据分开保存的标签的信息,以及每种类型中的数据在结构上是否相同?

编辑

为了澄清,我应该提到,尽管上面提供的示例使用了单字段结构,但问题实际上是关于包含多个字段的结构类型。

最佳答案

严格来说,这是不安全的。原因是spec的相关栏目没有为结构的内存布局提供任何指导。它不保证内存中的字段排序、打包或对齐。理论上,编译器可以根据优化信息,决定两个看似相同的结构根据它们的用法进行不同的表示。这甚至可能是一个 Heisenbug,其中有问题的优化不会在 go test 构建中发生。

实际上来说,这在任何真正的编译器中都不太可能发生,您可以安全地做到这一点。对于您提供的字段结构尤其如此。不过,在执行此操作之前,您可能应该通过分析来确保复制是不够的。

关于go - 只有标签不同的相同结构类型之间的不安全转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com