| 项目 | 规范 | 示例 | 说明 |
|---|---|---|---|
| 包名 | 全小写、简短、语义明确 | http, json, ossserver | 不要使用驼峰、大写、下划线 |
| 文件名 | 与包功能对应,小写加下划线分隔 | server.go, handler_test.go | 文件名可带 _test.go |
| 目录名 | 通常与包名一致 | /ossserver, /internal/ossserver | 导入路径中使用目录名 |
| 导入名 | 通常与包名相同 | import "example.com/app/ossserver" | Go 工具会自动识别 |
💡 不要在包名中包含
go或项目名重复的前缀(例如ossserver/ossserver)。
| 名称 | 可见性 | 示例 | 说明 |
|---|---|---|---|
| 小写开头 | 包内可见 | func start(), type server struct{} | 内部使用 |
| 大写开头 | 可导出(包外可见) | func Start(), type Server struct{} | 对外接口 |
| 缩写 | 全部大写 | HTTPServer, ID, URL | 保持一致,不写成 HttpServer |
| 常量 | 大写或驼峰 | const MaxSize = 1024 | 根据上下文确定 |
适用于中大型项目(含多个模块、组件、API):
myapp/ ├── cmd/ # 各独立可执行程序入口 │ └── myapp/ # 主程序入口(package main) │ └── main.go ├── internal/ # 私有逻辑(仅限本项目导入) │ └── ossserver/ # 内部模块 │ ├── server.go │ └── handler.go ├── pkg/ # 可复用模块(对外暴露) │ └── uploader/ │ ├── upload.go │ └── storage.go ├── api/ # 定义接口、协议、proto 等 │ └── v1/ │ └── types.go ├── configs/ # 配置文件模板 ├── scripts/ # 启动/构建脚本 ├── go.mod └── go.sum
internal/→ 项目内部使用的包,外部无法导入。pkg/→ 可以被其他项目复用的包。cmd/→ 每个可执行文件一个子目录。
goimport (
"fmt"
"example.com/myapp/internal/ossserver"
"example.com/myapp/pkg/uploader"
)
使用:
gofunc main() {
srv := ossserver.NewServer()
uploader.UploadFile("test.mp4")
fmt.Println("server started")
}
✅ 不要在导入时使用别名,除非名字冲突:
goimport ( jsoniter "github.com/json-iterator/go" // 当标准库 json 冲突时 )
| 错误写法 | 问题 |
|---|---|
package OssServer | 包名含大写,不符合 Go 风格 |
import "github.com/xxx/OSS_Server" | 导入路径不规范 |
HttpServer | 缩写大小写错误,推荐 HTTPServer |
pkg1, pkg2 | 包名无语义,不推荐 |
| 类型 | 命名示例 | 说明 |
|---|---|---|
| 包名 | ossserver | 全小写,简洁 |
| 结构体 | Server | 首字母大写 |
| 方法 | Start(), stop() | 控制导出性 |
| 常量 | DefaultPort | 驼峰命名 |
| 接口 | Reader, Writer | 一般以 -er 结尾 |
| 测试文件 | xxx_test.go | 包含测试函数 |
本文作者:zion
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!