Golang库中子程序的实现与应用
Golang库中子程序的实现与应用
我想贡献一个工具,它将通过库内的 //go:generate 指令来生成一些代码。这个工具是自写的,并且专用于该库,不能用于其他任何用途。
我的问题是:我应该把这个工具的代码存放在哪里?放在库里面吗?如果是,放在哪里?它并不打算在运行时被库用户使用,而且我不太喜欢代码就放在那里,可能还是可执行的。
或者应该把它放在一个单独的仓库里?有什么建议吗?谢谢!
func main() {
fmt.Println("hello world")
}
1 回复
更多关于Golang库中子程序的实现与应用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
对于将专用于库的生成工具代码存放位置,推荐将其置于库仓库内部的 internal 目录下,具体可放在 internal/cmd/your-tool 路径中。这种方式能确保工具代码与库代码紧密关联,同时通过 internal 目录的访问限制,避免库用户直接导入或使用该工具。工具可通过 //go:generate 指令调用,而不会暴露给外部用户。
示例代码结构如下:
your-library/
├── go.mod
├── your-library.go
├── internal/
│ └── cmd/
│ └── your-tool/
│ ├── main.go
│ └── go.mod
└── generated.go
在 generated.go 文件中,使用 //go:generate 指令调用工具:
//go:generate go run ./internal/cmd/your-tool/main.go
package yourlibrary
// 生成的代码将在此文件中使用
工具代码 internal/cmd/your-tool/main.go 示例:
package main
import (
"fmt"
"os"
)
func main() {
// 生成代码的逻辑
fmt.Println("Generating code for the library...")
// 例如:读取模板并写入生成的文件
content := "// Code generated by your-tool; DO NOT EDIT.\npackage yourlibrary\n\nfunc GeneratedFunction() {\n fmt.Println(\"Generated code\")\n}"
err := os.WriteFile("generated.go", []byte(content), 0644)
if err != nil {
panic(err)
}
}
在 internal/cmd/your-tool/go.mod 中定义独立的模块,以避免与主库的依赖冲突:
module your-library/internal/cmd/your-tool
go 1.21
这种方式将工具代码隔离在 internal 目录内,既保持了库的整洁,又确保了工具仅用于库内部的代码生成。

