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

Go 语言的代码生成器 gogen

  •  
  •   PhilosophyKing 2019-02-10 08:24:51 +08:00 8233 次点击
    这是一个创建于 2442 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近写项目时老是要用 Set 这个结构,但是 Go 没有 Generics,每次都得重复写一些东西。所以写了个带 WebUI 界面的代码生成器: https://creatcodebuild.github.io/gogen/

    代码在: https://github.com/CreatCodeBuild/gogen

    弱弱地说一句,我平时也在教课。想学编程的同学加我微信:we1070494510

    18 条回复    2019-02-11 13:21:05 +08:00
    PhilosophyKing
        1
    PhilosophyKing  
    OP
       2019-02-10 08:34:31 +08:00
    pabupa
        2
    pabupa  
       2019-02-10 08:47:32 +08:00
    ……老实说,我觉得这个项目浪费了这个名字呀。
    relaxgo
        3
    relaxgo  
       2019-02-10 09:45:49 +08:00 via Android   6
    乐于当老师挺好的,但是这个水平做老师,感觉早了点
    blless
        4
    blless  
       2019-02-10 09:48:51 +08:00 via Android   1
    我还以为是这种…
    https://github.com/dave/jennifer
    不过楼主你也可以看看人家的代码生成器是啥样的
    jseanj
        5
    jseanj  
       2019-02-10 09:54:44 +08:00
    项目应该叫 gogenset
    relaxgo
        6
    relaxgo  
       2019-02-10 10:09:54 +08:00 via Android
    既然写 go,用户名还是别用驼峰吧,看着太难受了,也容易遇到问题
    keepfun
        7
    keepfun  
       2019-02-10 11:52:22 +08:00 via iPhone
    @blless 虽然不知道什么场景会用到,但是收藏了。
    blless
        8
    blless  
       2019-02-10 14:19:47 +08:00 via Android
    @fenglangjuxu 很多地方能用啊,比如不想用反射,需要泛型什么的
    heiybb
        9
    heiybb  
       2019-02-10 16:09:33 +08:00 via Android
    哲的王?好像 B 站上刚看到这个
    PhilosophyKing
        10
    PhilosophyKing  
    OP
       2019-02-10 17:15:38 +08:00
    @blless 我在写这个之前看了的。和我的需求不吻合。我写这个是完全为了融入到我的 workflow。
    PhilosophyKing
        11
    PhilosophyKing  
    OP
       2019-02-10 17:16:55 +08:00
    @relaxgo 没懂什么意思?你是说我的 V2EX 用户名?
    azh7138m
        12
    azh7138m  
       2019-02-10 17:28:31 +08:00
    @relaxgo 一开始我觉得,不能随意诋毁别人的劳动成果,直到我点开源码,看到全是字符串拼接

    多说一句,最近好多 B 站的编程教学,看得我想砸电脑 :)
    Reficul
        13
    Reficul  
       2019-02-10 18:05:13 +08:00 via Android
    基于 js 字符串格式化的代码生成,不但不能保证生成的代码符合 Go 词法不说,正常情况下还线程不安全
    keepfun
        14
    keepfun  
       2019-02-10 18:48:43 +08:00 via iPhone
    @blless 我大概看了一遍 都是生成 golang 代码的 暂时还不知道 怎么实现你说的,替代反射。
    blless
        15
    blless  
       2019-02-10 19:37:13 +08:00 via Android
    @fenglangjuxu #14 随便举个例子,把一个特定的结构体序列化成 json 字符串最高效的办法是啥?肯定是硬编码,硬编码直接手写很麻烦,维护性也不高。这个时候代码生成器就可以用了。
    我想了下,代码生成器一个是需要性能比较重要的场景。不然大部分语言内部逻辑跟反射应该都可以实现。 还有一个就是比较成熟的框架,大部分增删改查模式比较固定的时候,也可以用代码生成器生成大量重复代码。
    keepfun
        16
    keepfun  
       2019-02-10 20:05:37 +08:00 via iPhone
    @blless 嗯 第一点 golang 结构体 json 化 后面加 tag 的确很麻烦,而且多数变量首字母还得大写(不知道是不是你的意思)
    第二点 php 反射就很流弊 一个文件的类 函数 变量都能通过反射获得并打印(据我目前的 golang 水平 go 这点貌似不好实现)
    第三点 这一点很好理解 就是我前面说的 生成代码。
    另外,多谢解答。
    PhilosophyKing
        17
    PhilosophyKing  
    OP
       2019-02-11 13:15:30 +08:00
    @blless 多谢你的解答。是的,我写这个工具的应用场景几乎和你说的一模一样。

    @Reficul @azh7138m 另外几位站友说的也没错,这个工具目前就是 JS 字符串生成而已。然后我再复制粘贴,但是对于我来说已经够了。就类似于 https://mholt.github.io/json-to-go/ , 也是 JS 生成而已。但是已经足以起到提高工作效率的作用。它并不是 automation 的一部分。

    因为工具是从我本身的 App 的一部分抽出来的( App 本身的测试是完全过关的),所以作为独立工具来说,当然还没有测试和语法检索等。所以我先放出来,如果真的其他人有这个需求,或者我自身的需求变多变频繁,我也会提高这个工具的工程质量。
    PhilosophyKing
        18
    PhilosophyKing  
    OP
       2019-02-11 13:21:05 +08:00
    @fenglangjuxu 补充一点,如果我日后的需求提升,我会考虑将其做成一个 CLI,然后该 CLI 可以自动扫描我的源代码,生成指定 type T 的 Container<T> 类型。这样就可以成为自动 workflow 或者 build 的一部分。但是目前项目不需要这么强的工具。

    目前这个 JS 版本仅仅花了 1-2 小时调试,纯粹是为了我少打字而已。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     886 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:16 PVG 04:16 LAX 13:16 JFK 16:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86