Golang - 结构体之间的转换

6

我有两个结构体

type A struct {
    a int
    b string
}

type B struct {
    A
    c string
    // more fields
}

我想将类型为A的变量转换为类型B(A只定义了一些关键基本字段,而B则包含“完整”数据)。

在Go中是否有可能进行此操作,还是我必须手动复制字段(或创建A.GetB()方法之类的方法,并使用它来将A转换为B)?


将A.data转换为B.data是什么意思? - erip
1
当嵌入式结构字段可以从父结构访问时,为什么需要将一个结构类型转换为另一个结构类型? - Endre Simo
1
在C++中,您可以将A作为B的基类,并为B提供一个接受A的构造函数(您甚至可以使用移动语义)。在Go中是否也可能呢? - Bathsheba
1
我不理解为什么会有人踩这个问题。这个问题很清晰,并且配有代码支持。 - Bathsheba
1
可能是将结构体分配给另一个结构体的重复问题。 - icza
显示剩余2条评论
2个回答

7
您的意思是将其转换为这样吗:
func main() {
    // create structA of type A
    structA := A{a: 42, b: "foo"}

    // convert to type B
    structB := B{A: structA}
}

1
这是一个很好的解决方案,我不知道在这个赋值之后,B.a会有不同于B.A.a的值。 - Artur Rychlewicz

-2
类型 AB 具有不同的基础类型,因此它们无法相互转换。没有办法。
因此,要么手动复制,要么提供执行此操作的转换器函数或方法。

这是错误的答案,请删除它。B中嵌入了A。 - khrm
1
不,答案是正确的。类型转换在https://golang.org/ref/spec#Conversions中有定义。这里相关的情况是“相同的基础类型”(它们没有)和“可分配”的情况,它们不是(请参见https://golang.org/ref/spec#Assignability)。B嵌入A的事实在这里完全无关紧要。 - Volker
可以,但是你可以使用不安全指针进行转换,因为布局非常相似。你不需要任何函数或其他东西。 - khrm
2
@khrm 不行,你不能这样做。你不能在这里使用 unsafe.Pointer,因为类型为 A 的值与类型为 B 的值具有不同的内存布局。B 的大小比 A 的大小要大,所以在将 *A 用作 *B 后,通过更改 B.c 字段,您可能会覆盖属于其他变量甚至包含代码的内存。无论如何都不要这样做! - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接