请教 Golang 中如何强转两个字段相同的结构体

2021-06-16 11:17:54 +08:00
 jonathanchoo

假如有结构体 A 和结构体 B,其中结构体元素相同,因为某些原因放在了不同的 package 下,在用到的地方如何强转?

除了 marshal unmarshal

unsafe package 能解决这个问题吗?

1939 次点击
所在节点    Go 编程语言
7 条回复
snowlyg
2021-06-16 11:27:15 +08:00
你说的强转是什么意思?
sdrzlyz
2021-06-16 11:28:15 +08:00
字段完全一样的话(包括 tag )是这可以直接转换的
```
type A struct {
Name string
}

type B struct {
Name string
}

func TestX(t *testing.T) {
a := A{}
var b B
b = B(a)
_ = b
}
```
jonathanchoo
2021-06-16 11:32:18 +08:00
我傻了,结贴
ElmerZhang
2021-06-16 11:36:37 +08:00
性能上最好的办法应该是写个转换函数来转,一个字段一个字段的 copy 。
以前用 Java 写微服务的时候这种情况很常见。我们的解决办法是每一种转换都单独写一个函数,函数里面有的是一个字段一个字段的手动 set,有的是直接用反射来 copy ( Java 里通常叫 Bean Copy )。这样未来万一两个结构体的转换方式有变化,比如字段不是一一对应了,或者 copy 的时候需要做一些转换了,只改这个函数的实现就可以了。
hemingway
2021-06-16 13:07:45 +08:00
Fu4ng
2021-07-04 15:56:24 +08:00
序列化之后再反序列化回来把。
这相当于深拷贝。。
Fu4ng
2021-07-04 15:58:59 +08:00
@hemingway 感谢分享

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX