考虑两种结构相同但标签不同的类型:type Foo struct { Id int64 `json:"-"`}type Bar struct { Id int64 `json:"id"`}不幸的是,当两种类型的标签不同并且有充分的理由时,Go 的习惯用法禁止在两种类型之间进行转换。但是我仍然需要能够控制序列化为 JSON 并且不想使用interface{}类型的数据。我的问题是,使用 golangunsafe.Pointer在结构相同(但不是标签)的两种类型之间执行强制转换有多安全?就像是:rf := &Foo{1}rb := (*Bar)(unsafe.Pointer(rf))是否有任何在所有的恐慌,也许随之而来的机会,因为内部各两种类型的数据被保持略有不同,由于标签的不同或即将标签每种类型的与实际的数据类型和数据分别举行的信息结构相同吗?编辑为了澄清起见,我应该提到,尽管上面提供的示例使用单字段结构,但问题实际上是关于包含多个字段的结构类型。
2 回答
元芳怎么了
TA贡献1798条经验 获得超7个赞
不幸的是,当两种类型的标签不同并且有充分的理由时,Go 的习惯用法禁止在两种类型之间进行转换
Go 1.8(目前处于测试阶段)的发行说明似乎表明此限制现已解除:
语言的变化
当将值从一种结构类型显式转换为另一种结构类型时,从 Go 1.8 开始,这些标记将被忽略。
因此,两个仅标签不同的结构可以从一个转换为另一个:
func example() {
type T1 struct {
X int `json:"foo"`
}
type T2 struct {
X int `json:"bar"`
}
var v1 T1
var v2 T2
v1 = T1(v2) // now legal
}
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消