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

对于基本类型,如果它们的基础类型相同,我们可以很容易地强制转换类型。但是,具有相同内存布局的结构中的字段不能轻松地从一种类型转换为另一种类型。有一个关于这个问题的建议,不幸的是它被拒绝了。经过一个小时的谷歌搜索,没有运气,我来到这里寻求专家的帮助。


看看下面的例子:


package main


import (

    "fmt"

)


type Int int


type 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


Helenr
浏览 87回答 1
1回答

蛊毒传说

你不能仅仅因为语言规范不允许这样做就这样做。关于结构,如果 Spec: Conversion:在以下任何一种情况下,非常量值都可以转换为类型:xT...忽略结构标记(见下文),的类型并具有相同的基础类型。xT如果您绝对确定结构的内存布局是相同的,则可以使用不安全的转换(使用包不安全),如下所示:var a A = A{"Foo", 21}var b Bb = *(*B)(unsafe.Pointer(&a))fmt.Println(a, b)这将输出(在Go Playground上尝试):{Foo 21} {Foo 21}但以此为最后的手段。使用你失去编译时类型安全性和可移植性保证。例如,如果以后您只修改其中一个结构,则上述代码将继续编译,即使它可能不再正确,编译器将无法通知您。unsafe
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go