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 目录内,既保持了库的整洁,又确保了工具仅用于库内部的代码生成。

回到顶部