发现 autohotkey 这东西把 Go 写的命令行包装成 GUI 真是神器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wojiugaiming
V2EX    程序员

发现 autohotkey 这东西把 Go 写的命令行包装成 GUI 真是神器

  •  1
     
  •   wojiugaiming 63 天前 3768 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己用 Go 语言写了一个命令行,感觉老是终端调用很麻烦,就想着包装成图形界面,后面看了以下 Go 语言有什么 Gui 框架

    以前试过 Godot+Go 语言写界面,那界面叫一个粗糙,中途也尝试过 aardio+Go 语言方式,老是出错,没耐心放弃了

    现在看了一下有:Fyne 、Walk 、GioUi 、wails , wails 还要会前端,我不会。。。。 Walk 不用会前端,好像很久没更新,放弃 Fyne 、GioUi 这两个可以开发 win 、linux 、mac 、安卓、ios ,还可以,后面弄了一下,各种出错

    一来火,谷歌狂找替代,发现 autohotkey 这东西还不错,就想看这东西能不能调用我的命令行,包装成界面,并且编译成 exe ,发现还可以哟。 594Kb 这打包成 exe 才 1.3M ,运行后占用内存 2.5M ,Upx 压缩一下后,exe 占用 594kb ,妙啊

    后面信心大涨,学着用 GioUi 重写,自己不够聪明各种报错,放弃。学着用 fyne 重写界面调用命令行,编译后 23Mb ,Upx 压缩后 8.61Mb ,运行占用内存 181.1Mb ,我天

    还是写成命令行+authotkey 这种香,

    有像我这样的兄弟吗?还有更骚的操作推荐吗?推荐一下,大家一起学习一下

    28 条回复    2025-10-03 17:53:45 +08:00
    iorilu
        1
    iorilu  
       63 天前
    现在前端都用 ai 写阿, 尤其你把命令行的接口告诉 ai, 很容易整出一个

    用 wails, 主要前端比较美观
    wakarimasen
        2
    wakarimasen  
       63 天前
    如果不需要分发直接起 HTTP server 然后访问 localhost:[port]
    Tomatopotato
        3
    Tomatopotato  
       63 天前
    可以看看 ahk 做出的界面吗
    Tomatopotato
        4
    Tomatopotato  
       63 天前
    @wakarimasen 这确实也是个思路。直接在 go 程序里写个服务器,写个简单前端网页,打包出 exe ,双击直接跳转浏览器,相当于用浏览器当 gui 了。
    roundgis
        5
    roundgis  
       63 天前 via Android
    我以前用过 autoit 写界面
    wojiugaiming
        6
    wojiugaiming  
    OP
       63 天前 via Android
    @iorilu 前端完全没摸过,主要不会啊,怎么个过程我都不清楚
    tr>
    wojiugaiming
        7
    wojiugaiming  
    OP
       63 天前 via Android
    @Tomatopotato 懒得上传了,就写了一个控制智能开关的命令行,一个界面上带了开启关闭按钮,还有设置时间间隔、时间点定时开启关闭
    wojiugaiming
        8
    wojiugaiming  
    OP
       63 天前 via Android
    @roundgis 尝试 ai 写过,就这个 autohotkey 运行起来了,打包也小,我就感觉挺满意了
    wojiugaiming
        9
    wojiugaiming  
    OP
       63 天前 via Android
    @wakarimasen 浏览器访问也不是很方便,我感觉就想着写着界面,最好安卓、win 能一起就更好了
    Donduck
        10
    Donduck  
       63 天前
    AHK 也不是一个跨平台的东西啊
    wojiugaiming
        11
    wojiugaiming  
    OP
       63 天前 via Android
    @Donduck 所以我后面用 fyne 重写了,但是随随便便一个接近 hello world 的界面,运行起来都差不多 180Mb 运行内存了。。
    czyt
        12
    czyt  
       63 天前
    我用 autoit
    iorilu
        13
    iorilu  
       62 天前
    @itakeman 现在都 ai 搞得, 你不会还没用上 ai 写代码把, 学习下吧, 比你折腾其他玩意强

    现在我基本明白了

    搞 gui 即便就两条路

    要么选择该语言原生 gui, 如果有的话, 要么用 webview+web 那套

    其他都瞎折腾没意义
    yyysuo
        14
    yyysuo  
       62 天前
    @itakeman go 里面写 api ,静态单文件 html 调用 api 。vibe coding ,只需要描述自己的需求就好了,报错就扔给 ai ,可以的。
    kasusa
        15
    kasusa  
       62 天前   1
    https://github.com/cornradio/ahkshortcut
    都说到 ahk 了 我推荐一下自己写的小工具。
    用这个你可以把任何命令行直接变成快捷键。
    Luckykeeper
        16
    Luckykeeper  
       62 天前
    挺像的,前端苦手,最早是用的 Fyne ,后来去看了看 Godot + Go 的方案看着挺不错,稍微学了下感觉没有 Fyne 好看,于是去学了 Flutter ,现在是 Flutter + Go ,OP 不妨去试一下 Flutter ,或许有人说 Flutter 选了 Dart 作为开发语言是败笔,但是从我使用感受来看,我觉得 Dart 对于写 Go 的上手难度比 JS 那套低很多,界面做出来又好看(缺点是对上古浏览器的兼容以及加载速度这块,重一些),学会了 Flutter 还可以顺手写写客户端,很爽

    实践:Devops ,用 Go + Fyne 写过类 Ansible 的自动部署工具( C/S ),Go + Flutter 写了 k8s 的容器管理和离线升级平台(C/S),Go + Flutter 写了 k8s 微服务(B/S)等等,都很好用,自从会写 Flutter 之后就把 Fyne 扔了,太香了,想打客户端就打客户端,想打 web 包就打 web 包

    附一张图康康效果:

    https://youke1.picui.cn/s1/2025/09/24/68d35bb093a8b.png
    wojiugaiming
        17
    wojiugaiming  
    OP
       62 天前
    @iorilu @iorilu 有用过,就是我是业余学习的编程。完全不了解前端写代码的整过过程,自己懂得东西,有时候问 ai 都能写错,更不用说不懂的东西了,想问 ai 都无从下手

    本来想选择原生的,性能也不咋地,想着这样骚操作也能用,就不在乎了
    wojiugaiming
        18
    wojiugaiming  
    OP
       62 天前
    @yyysuo 感谢提示,有空试一下可行性
    wojiugaiming
        19
    wojiugaiming  
    OP
       62 天前   1
    @kasusa 哇,还有这样的神器啊,好东西啊
    wojiugaiming
        20
    wojiugaiming  
    OP
       62 天前
    @Luckykeeper 为了跨平台,我学习了很多,go 语言也是因为这个才学习的。为了写 ui 我最早就是学了一部分 Flutter ,因为不是从事这行业,时间也有限。学到一半,后面没时间久了就慢慢放弃了,现在拿起来都没什么勇气,感谢你的鼓励,突然有那么点动力重新拾起来
    wojiugaiming
        21
    wojiugaiming  
    OP
       62 天前
    @Luckykeeper 另外请教一下,Flutter + Go 交互是不是就 go 开启 web 服务,flutter 进行请求,如果这样感觉不是很完美
    blankmiss
        22
    blankmiss  
       61 天前
    为什么不用 wails
    Luckykeeper
        23
    Luckykeeper  
       61 天前
    @itakeman #21 我是 Go 开 web 服务,Flutter 去请求做的,因为我这边写的小工具需要在没有装 Docker 的情况下去操作 Docker 镜像(多架构镜像复制/单架构镜像 pull & push )去实现 k8s 应用的离线升级,您说的也有道理,如果在没有特殊需求的时候不是很完美,因为用户使用的时候他需要去开两个应用,为了缓解这个问题,能让他只打开一个应用就使用,我这里提供两个思路,不过还没实践过

    1 、参考 [微力同步] 的实现方式,不过换成 Go + Flutter ,Flutter 打 web 包,Go 的项目隐藏掉 Console ,托盘里面挂个 icon ,然后可以呼出浏览器打开你的 Flutter 项目,在 WEB 上交互,这个不开源,但是可以下载下来体验下,移动端和桌面端都有
    2 、GitHub 上有这么个项目 [ComicSparks/pikapika] (好像迁移了,我印象里面之前是挂在 niuhuan 这个号下面的),我第一次知道 Flutter 就是从他这里知道的,不过这个项目并不是完全开源,可以看下他项目 Readme 的 [Technology Stack => Multi-platform adaptation] 这部分,他的桌面端是 go-flutter ,移动端是 gomobile 然后 flutter 去调,使用起来体验非常好,可以下个他的 Release 包试试效果
    wojiugaiming
        24
    wojiugaiming  
    OP
       61 天前
    @blankmiss 不会写 js 、web 那一套
    wanjun
        25
    wanjun  
       61 天前
    fyne 写过,打包后 8M ,运行后占内存 23M
    wojiugaiming
        26
    wojiugaiming  
    OP
       61 天前
    @wanjun 你这个是怎么优化的?
    icelei
        27
    icelei  
       60 天前
    AHK 只能在 win 下跑,想在 mac 或者 linux 下就没办法了
    wanjun
        28
    wanjun  
       53 天前 via iPhone
    @itakeman 没任何优化,可能是因为功能简单
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1581 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 16:28 PVG 00:28 LAX 08:28 JFK 11:28
    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