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

具有相同基础类型的类型转换结构

具有相同基础类型的类型转换结构

Go
Helenr 2022-08-01 09:34:46
对于基本类型,如果它们的基础类型相同,我们可以很容易地强制转换类型。但是,具有相同内存布局的结构中的字段不能轻松地从一种类型转换为另一种类型。有一个关于这个问题的建议,不幸的是它被拒绝了。经过一个小时的谷歌搜索,没有运气,我来到这里寻求专家的帮助。看看下面的例子:package mainimport (    "fmt")type Int inttype A struct {    name string    age  Int}type B struct {    name string    age  int}func main() {    var a A= A{"Foo",21}    var b B= B{"Bar", 21}    fmt.Println(a,b,(A)(b))  //Error here as expected}even尽管结构 A 和 B 具有相同的底层类型,为什么我不能像底层类型一样相互转换。除非基础类型不同,否则是否可以递归强制转换?struct { string,int}Intint
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

你不能仅仅因为语言规范不允许这样做就这样做。关于结构,如果 Spec: Conversion:


在以下任何一种情况下,非常量值都可以转换为类型:xT


...

忽略结构标记(见下文),的类型并具有相同的基础类型。xT

如果您绝对确定结构的内存布局是相同的,则可以使用不安全的转换(使用包不安全),如下所示:


var a A = A{"Foo", 21}

var b B


b = *(*B)(unsafe.Pointer(&a))

fmt.Println(a, b)

这将输出(在Go Playground上尝试):


{Foo 21} {Foo 21}

但以此为最后的手段。使用你失去编译时类型安全性和可移植性保证。例如,如果以后您只修改其中一个结构,则上述代码将继续编译,即使它可能不再正确,编译器将无法通知您。unsafe


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

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