将TypeA转换为TypeB,其中基础字段类型相同

时间:2016-07-29 08:22:08

标签: go casting converter

在我的游乐场代码中,有两种类型共享非常相似的字段定义,如此,

type Int64 int64

type TA struct {
    A Int64
    B string
}

type TB struct {
    A int64
    B string
}

如何在最小代码和性能成本之间进行转换?

https://play.golang.org/p/VFERyT-RgK

P.S。经过测试,TA(some_tb_value)与上述情况一样,只有在TA.A与TB.A完全相同的情况下才有效。但是,使基础类型(Int64-> int64)完全相同并不适合我需要的用例。

P.S。使用某种协议(json)序列化some_tb_value并将其反序列化为TA类型的指针是可能的,但对于关键路径使用来说它可能太重了

1 个答案:

答案 0 :(得分:1)

由于它们是不同的结构类型,因此无法转换它们。

一种解决方案是使用反射(reflect包)来复制字段。

由于它们具有相同的内存布局,另一种解决方案是使用包unsafe

func main() {
    var a TA = TA{1, "I'm TA"}
    var b TB = TB{2, "I'm TB"}
    fmt.Println(TA2TB(&a), TB2TA(&b))
}

func TA2TB(a *TA) *TB {
    return (*TB)(unsafe.Pointer(a))
}
func TB2TA(b *TB) *TA {
    return (*TA)(unsafe.Pointer(b))
}

输出(在Go Playground上尝试):

&{1 I'm TA} &{2 I'm TB}

但是要知道使用unsafe会丢失所有类型的安全检查。如果将来类型被修改,代码将继续编译,但在运行时可能会出现神秘错误(运行时恐慌如果你很幸运,在更糟糕的情况下会出现无声行为,在最坏的情况下会完全崩溃)。

最好是重构代码并使用相同的底层类型,因此您只需执行类型conversion