我有一个如下模型:
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
时,我可以毫无问题地转换结构。
问题是,即使底层结构完全相同,为什么我不能将实例转换为彼此?
谢谢!
答案 0 :(得分:1)
转换项目时,仅使用相同的布局是不够的,need to have the same underlying type for all their fields。
在这种情况下,您可以做的最好的事情是创建一个所需类型的新结构,并用旧结构中的数据填充它的字段。
我玩了一些这个,但我没能做得更好。
我假设两个KeyData
类型需要不同的方法集?如果这是不的情况,你应该在两个地方使用相同的类型。
答案 1 :(得分:0)
您无法正常转换或分配不同类型的变量。但是如果它是必要的并且您确定结构具有相同的底层布局,则可以省略编译器的保证并使其不安全。
import "unsafe"
...
a := *((*TeamsKey)(unsafe.Pointer(&k)))
...
不建议没有严肃的理由,你应该好好理解你的所作所为。