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 · 7658 次点击
    这是一个创建于 1901 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近写项目时老是要用 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,用户名还是别用驼峰吧,看着太难受了,也容易遇到问题
    fenglangjuxu
        7
    fenglangjuxu  
       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 词法不说,正常情况下还线程不安全😂😂😂
    fenglangjuxu
        14
    fenglangjuxu  
       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 字符串最高效的办法是啥?肯定是硬编码,硬编码直接手写很麻烦,维护性也不高。这个时候代码生成器就可以用了。
    我想了下,代码生成器一个是需要性能比较重要的场景。不然大部分语言内部逻辑跟反射应该都可以实现。 还有一个就是比较成熟的框架,大部分增删改查模式比较固定的时候,也可以用代码生成器生成大量重复代码。
    fenglangjuxu
        16
    fenglangjuxu  
       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   ·   我们的愿景   ·   实用小工具   ·   5314 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:28 · PVG 16:28 · LAX 01:28 · JFK 04:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.