如何在Golang中转换其中包含另一个结构的结构?

时间:2017-09-01 14:59:26

标签: go struct casting type-conversion type-assertion

我有一个如下模型:

type TeamsKey struct {
    KeyData TeamsKeyData
    Fingerprint string
    Algorithm string
    Encoding string
    Usage string
}

type TeamsKeyData struct {
    KeyId string
    Key string
    Description string
    ExpiresAt string
    CreatedAt string
 }

type Key struct {
    KeyData     KeyData
    Fingerprint string
    Algorithm   string
    Encoding    string
    Usage       string
}

type KeyData struct {
    KeyId       string
    Key         string
    Description string
    ExpiresAt   string
    CreatedAt   string
}

我想将Key的实例转换为TeamsKey。虽然底层结构相同,但我无法转换它。

func main() {
    k := Key{}
    a := TeamsKey(k)
}

我得到的错误:

tmp/sandbox251934449/main.go:46:15: cannot convert k (type Key) to type TeamsKey

当我在TeamsKeyData结构中将KeyData更改为TeamsKey时,我可以毫无问题地转换结构。

问题是,即使底层结构完全相同,为什么我不能将实例转换为彼此?

谢谢!

2 个答案:

答案 0 :(得分:1)

转换项目时,仅使用相同的布局是不够的,need to have the same underlying type for all their fields

在这种情况下,您可以做的最好的事情是创建一个所需类型的新结构,并用旧结构中的数据填充它的字段。

我玩了一些这个,但我没能做得更好。

我假设两个KeyData类型需要不同的方法集?如果这是的情况,你应该在两个地方使用相同的类型。

答案 1 :(得分:0)

您无法正常转换或分配不同类型的变量。但是如果它是必要的并且您确定结构具有相同的底层布局,则可以省略编译器的保证并使其不安全。

import "unsafe"
...
a := *((*TeamsKey)(unsafe.Pointer(&k)))
...

不建议没有严肃的理由,你应该好好理解你的所作所为。