V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jonathanchoo
V2EX  ›  Go 编程语言

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

  •  
  •   jonathanchoo · 2021-06-16 11:17:54 +08:00 · 1914 次点击
    这是一个创建于 1249 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    除了 marshal unmarshal

    unsafe package 能解决这个问题吗?

    7 条回复    2021-07-04 15:58:59 +08:00
    snowlyg
        1
    snowlyg  
       2021-06-16 11:27:15 +08:00
    你说的强转是什么意思?
    sdrzlyz
        2
    sdrzlyz  
       2021-06-16 11:28:15 +08:00   ❤️ 1
    字段完全一样的话(包括 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
        3
    jonathanchoo  
    OP
       2021-06-16 11:32:18 +08:00
    我傻了,结贴
    ElmerZhang
        4
    ElmerZhang  
       2021-06-16 11:36:37 +08:00   ❤️ 1
    性能上最好的办法应该是写个转换函数来转,一个字段一个字段的 copy 。
    以前用 Java 写微服务的时候这种情况很常见。我们的解决办法是每一种转换都单独写一个函数,函数里面有的是一个字段一个字段的手动 set,有的是直接用反射来 copy ( Java 里通常叫 Bean Copy )。这样未来万一两个结构体的转换方式有变化,比如字段不是一一对应了,或者 copy 的时候需要做一些转换了,只改这个函数的实现就可以了。
    hemingway
        5
    hemingway  
       2021-06-16 13:07:45 +08:00
    Fu4ng
        6
    Fu4ng  
       2021-07-04 15:56:24 +08:00
    序列化之后再反序列化回来把。
    这相当于深拷贝。。
    Fu4ng
        7
    Fu4ng  
       2021-07-04 15:58:59 +08:00
    @hemingway 感谢分享
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:26 · PVG 15:26 · LAX 23:26 · JFK 02:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.