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

请问大家在项目中是如何完成结构体之间的转换的,如: DTO ---> VO

  •  
  •   Morii · 2022-01-07 11:15:23 +08:00 · 4522 次点击
    这是一个创建于 812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前用 java 的时候是通过 mapStruct 做的,不知道 golang 有什么轻松地方式?

    30 条回复    2022-01-09 10:37:42 +08:00
    stevenbipt
        1
    stevenbipt  
       2022-01-07 11:44:20 +08:00
    有一些赋值的轮子,类似这个:https://github.com/zywaited/xcopy,好像 go-zero 也提供了这种拷贝的库
    me221
        2
    me221  
       2022-01-07 11:51:40 +08:00
    蹲一个 java 中有什么轻松的方式
    Morii
        3
    Morii  
    OP
       2022-01-07 11:56:43 +08:00
    @me221 #2

    mapStruct ,就是编译会变慢,不过个人感觉很好用
    xlsepiphone
        4
    xlsepiphone  
       2022-01-07 12:25:53 +08:00
    Java:
    如果轻度使用=> HuTool
    重度使用=>ModelMapper
    dqzcwxb
        5
    dqzcwxb  
       2022-01-07 12:27:05 +08:00
    手动 set 性能最高
    masterclock
        6
    masterclock  
       2022-01-07 12:33:42 +08:00
    用 protobuf 比较多,考虑过写个插件自动生产点转换代码,后来用上 GitHub copilot 后感觉没有需求了,copilot 基本能自动生成转换函数。
    kosgug
        7
    kosgug  
       2022-01-07 12:34:55 +08:00 via iPhone
    kid8768611
        8
    kid8768611  
       2022-01-07 14:32:17 +08:00
    蹲一个 java 中有什么轻松的方式
    Chinsung
        9
    Chinsung  
       2022-01-07 14:39:54 +08:00
    以前用 BeanUtils ,现在手动 set 。
    复杂业务多层转换之后,你不手动,全是这种转换,真的很难知道哪些字段有值哪些字段没值
    silentsky
        10
    silentsky  
       2022-01-07 15:28:22 +08:00
    手动 set 比较好,当你改了某些属性,编译会给你报错提示,BeanUtils 那些你无法感知到,后期维护痛苦
    HENQIGUAI
        11
    HENQIGUAI  
       2022-01-07 15:39:52 +08:00
    手写 Converter..
    alen0206
        12
    alen0206  
       2022-01-07 15:49:43 +08:00
    MapStruct
    2i2Re2PLMaDnghL
        13
    2i2Re2PLMaDnghL  
       2022-01-07 15:53:51 +08:00
    来点邪道的:代码生成
    leafre
        14
    leafre  
       2022-01-07 16:18:44 +08:00 via Android
    mapstruct
    cocoabeans
        15
    cocoabeans  
       2022-01-07 16:21:21 +08:00
    MapStruct + 1 +1
    yjll9102
        16
    yjll9102  
       2022-01-07 16:22:20 +08:00
    MapStruct + 1 +1 +1
    www5070504
        17
    www5070504  
       2022-01-07 16:39:51 +08:00
    Dkngit
        18
    Dkngit  
       2022-01-07 16:46:32 +08:00
    以前用 BeanUtils ,现在手动 set 。
    xianyv
        19
    xianyv  
       2022-01-07 16:50:25 +08:00
    以前用 BeanUtils,现在还在用 BeanUtils,只是有的时候改字段后会少赋值
    hingbong
        20
    hingbong  
       2022-01-07 16:54:21 +08:00
    当然是 copilot 生成啊,都不会写代码了现在
    Kontinue
        21
    Kontinue  
       2022-01-07 16:54:50 +08:00
    BeanUtils + 特殊的手动赋值
    fzls
        22
    fzls  
       2022-01-07 17:56:52 +08:00
    @hingbong copilot 做这种事真的完美
    sifeizhai2020
        23
    sifeizhai2020  
       2022-01-07 18:32:12 +08:00
    @Kontinue BeanUtils + 特殊的手动赋值 + 1
    itechnology
        24
    itechnology  
       2022-01-07 18:33:18 +08:00
    手动 set 比较好,不然万一出错了,你找起来会比较麻烦
    tqccc
        25
    tqccc  
       2022-01-07 20:12:56 +08:00 via Android
    目前手里是十年左右的屎山和屎表,用手动 set ,手动 set 感觉方便查问题
    WoodenTea
        26
    WoodenTea  
       2022-01-07 21:05:56 +08:00   ❤️ 2
    为什么你们喜欢把结构体变来变去? DTO, VO 我感觉就是一个概念而已呀
    xuanbg
        27
    xuanbg  
       2022-01-08 08:13:35 +08:00
    我用万能的序列化 /反序列化来实现一个 convert 泛型方法,可以把任何对象转换为你指定的类型。至于转换的结果嘛,只要字段对的上就能转,对不上的就会丢掉。
    lqw3030
        28
    lqw3030  
       2022-01-08 09:58:17 +08:00 via iPhone
    @WoodenTea 万一把 xxx_password 字段序列化返回给视图,就不一样了
    WoodenTea
        29
    WoodenTea  
       2022-01-08 11:02:46 +08:00
    @lqw3030 序列化的时候可以指定 ignore 字段
    lqw3030
        30
    lqw3030  
       2022-01-09 10:37:42 +08:00
    @WoodenTea 根源性避免这类风险
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2923 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:13 · PVG 22:13 · LAX 07:13 · JFK 10:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.