贝利信息

Go 项目中如何正确组织多目录结构的同包代码

日期:2026-01-15 00:00 / 作者:心靈之曲

go 官方工具链要求每个目录对应一个独立包,因此无法在单个 `main` 包下跨子目录(如 `models/`)存放源文件;若坚持同包,需放弃 `go build` 等标准命令,改用底层编译器直接构建——但该方式缺乏文档支持、不可维护,不推荐。

在 Go 中,包(package)与文件系统目录严格一一对应。这意味着:

✅ 正确做法:遵循 Go 的惯用结构,按功能拆分包

src/myProject/
├── main.go                # package main
├── models/                # package models
│   ├── foo.go             # package models
│   └── bar.go             # package models
└── cmd/                   # (可选)显式分离入口
    └── myapp/
        └── main.go        # package main —— 更清晰的入口管理

models/foo.go 示例:

package models

type Foo struct {
    ID   int
    Name string
}

main.go 中导入使用:

package main

import (
    "fmt"
    "myProject/models" // 模块路径需匹配 GOPATH 或 go.mod module name
)

func main() {
    f := models.Foo{ID: 1, Name: "test"}
    fmt.Println(f)
}

⚠️ 注意事项:

总结:Go 的目录即包设计不是限制,而是对代码边界与职责分离的强制约定。接受它,用好它——结构清晰、工具友好、团队协作顺畅,才是真正的工程效率。