假设你希望通过 Python 脚本自动生成一些与 Go 文件相关的辅助代码(比如,数据模型文件或文档),可以通过这种方式实现。
使用 //go:generate python3 models.py $GOFILE $GOPACKAGE 表示在运行 go generate 时,
将执行一段 Python 脚本 models.py,并将 Go 文件的文件名和包名作为参数传递给脚本。这是一种灵活的方式,
可以结合 Python 脚本生成相关的代码或文件。
main.go
//go:generate python3 models.py $GOFILE $GOPACKAGE
package main
import "fmt"
func main() {
fmt.Println("This is an example of go:generate with Python.")
}
models.py
import sys
# 从命令行获取参数
if len(sys.argv) != 3:
print("Usage: python3 models.py <GOFILE> <GOPACKAGE>")
sys.exit(1)
gofile = sys.argv[1]
gopackage = sys.argv[2]
# 输出信息
print(f"Generating models for Go file: {gofile} in package: {gopackage}")
# 模拟生成一个模型文件
output_file = f"{gopackage}_models.txt"
with open(output_file, "w") as f:
f.write(f"// Models generated for {gofile} in package {gopackage}\n")
f.write(f"// This file is auto-generated. Do not edit!\n\n")
f.write("type Model struct {\n")
f.write(" ID int\n")
f.write(" Name string\n")
f.write("}\n")
print(f"Generated {output_file}")
运行 go generate:
go generate ./...
解释
go generate 的行为:
读取 main.go 文件。
解析其中的 //go:generate 注释。
替换 $GOFILE 为 main.go,替换 $GOPACKAGE 为 main。
实际执行以下命令:
python3 models.py main.go main
Python 脚本的输出:
Generating models for Go file: main.go in package: main
Generated main_models.txt
生成一个文件 main_models.txt,内容如下:
// Models generated for main.go in package main
// This file is auto-generated. Do not edit!
type Model struct {
ID int
Name string
}