V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jonathanchoo

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

  •  
  •   jonathanchoo · Jun 16, 2021 · 2385 views
    This topic created in 1779 days ago, the information mentioned may be changed or developed.

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

    除了 marshal unmarshal

    unsafe package 能解决这个问题吗?

    7 replies    2021-07-04 15:58:59 +08:00
    snowlyg
        1
    snowlyg  
       Jun 16, 2021
    你说的强转是什么意思?
    sdrzlyz
        2
    sdrzlyz  
       Jun 16, 2021   ❤️ 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
       Jun 16, 2021
    我傻了,结贴
    ElmerZhang
        4
    ElmerZhang  
       Jun 16, 2021   ❤️ 1
    性能上最好的办法应该是写个转换函数来转,一个字段一个字段的 copy 。
    以前用 Java 写微服务的时候这种情况很常见。我们的解决办法是每一种转换都单独写一个函数,函数里面有的是一个字段一个字段的手动 set,有的是直接用反射来 copy ( Java 里通常叫 Bean Copy )。这样未来万一两个结构体的转换方式有变化,比如字段不是一一对应了,或者 copy 的时候需要做一些转换了,只改这个函数的实现就可以了。
    hemingway
        5
    hemingway  
       Jun 16, 2021
    Fu4ng
        6
    Fu4ng  
       Jul 4, 2021
    序列化之后再反序列化回来把。
    这相当于深拷贝。。
    Fu4ng
        7
    Fu4ng  
       Jul 4, 2021
    @hemingway 感谢分享
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2650 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 02:25 · PVG 10:25 · LAX 19:25 · JFK 22:25
    ♥ Do have faith in what you're doing.