如何通过 go:generate 实现命令行标准输入输出重定向?
- 内容介绍
- 文章标签
- 相关推荐
本文共计669个文字,预计阅读时间需要3分钟。
相关专题内容,无需试图解,避免啰嗦,不超过100字,直接输出结果:
`go:generate` 本身不支持 shell 语法(如 ``),但可通过 `sh -c` 包装命令实现 stdin/stdout 重定向,从而调用管道型工具生成 go 源码。
在 Go 项目中,go:generate 是自动化代码生成的重要机制,常用于从模板、配置或数据文件生成 Go 源码。然而,其设计初衷是调用可执行命令,而非解析 shell 表达式——这意味着直接书写 //go:generate tool < input.txt > output.go 会失败,因为 go:generate 将 < 和 > 视为工具的字面参数,而非重定向操作符。
✅ 正确做法是借助系统 shell(如 sh 或 bash)来解析重定向语义。推荐使用 POSIX 兼容的 sh -c:
//go:generate sh -c "tool < file.txt > file.go"
该写法中:
- sh -c 启动一个 shell 实例;
- 双引号内的字符串作为 shell 命令整体执行,< 和 > 由 shell 解析并生效;
- tool 从 file.txt 读取 stdin,将生成的 Go 代码写入 file.go。
本文共计669个文字,预计阅读时间需要3分钟。
相关专题内容,无需试图解,避免啰嗦,不超过100字,直接输出结果:
`go:generate` 本身不支持 shell 语法(如 ``),但可通过 `sh -c` 包装命令实现 stdin/stdout 重定向,从而调用管道型工具生成 go 源码。
在 Go 项目中,go:generate 是自动化代码生成的重要机制,常用于从模板、配置或数据文件生成 Go 源码。然而,其设计初衷是调用可执行命令,而非解析 shell 表达式——这意味着直接书写 //go:generate tool < input.txt > output.go 会失败,因为 go:generate 将 < 和 > 视为工具的字面参数,而非重定向操作符。
✅ 正确做法是借助系统 shell(如 sh 或 bash)来解析重定向语义。推荐使用 POSIX 兼容的 sh -c:
//go:generate sh -c "tool < file.txt > file.go"
该写法中:
- sh -c 启动一个 shell 实例;
- 双引号内的字符串作为 shell 命令整体执行,< 和 > 由 shell 解析并生效;
- tool 从 file.txt 读取 stdin,将生成的 Go 代码写入 file.go。

