Golang代码格式化及文件命名问题探讨

Golang代码格式化及文件命名问题探讨 我正在编写一个库,例如关于图论的库。在我的代码仓库中,我有以下文件夹结构: red_black_tree <- 文件夹 — Key.go <- 接口 — Node.go <- 节点的结构定义及其操作(已实现) — RedBlack.go <- 我的红黑树实际代码 — RedBlack_test.go <- 红黑树的单元测试

所有4个.go文件都属于同一个包redblack

以下是几个关于Go语言最佳实践的问题:

  • 这4个文件的名称是否应该使用小写(例如key.go而不是Key.go)?
  • 较长的文件名是否应该使用下划线:例如red_black.go而不是RedBlack.go
  • 单元测试文件必须以_test.go结尾,那么它应该命名为red_black_test.go吗?
  • 单元测试文件在redblack包中,我是否应该将其定义为属于redblack_test包?

请告诉我关于这些问题的最佳实践/通常习惯。我理解其中一些问题可能只是个人偏好,但我仍然对最佳实践感到好奇。


更多关于Golang代码格式化及文件命名问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

更多关于Golang代码格式化及文件命名问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,代码格式化和文件命名遵循明确的约定,这些约定由go fmt工具和社区共识强制执行。以下是针对您问题的具体解答:

1. 文件命名规范

Go标准库和社区普遍使用小写蛇形命名法(snake_case) 作为文件名。对于您的文件:

  • key.go ✅(而非Key.go
  • node.go ✅(而非Node.go
  • red_black.go ✅(而非RedBlack.go
  • red_black_test.go ✅(而非RedBlack_test.go

示例:

red_black_tree/
├── key.go
├── node.go
├── red_black.go
└── red_black_test.go

2. 包命名与测试文件

  • 主包文件:所有文件应属于同一个包redblack(小写)。
  • 测试文件:通常使用相同的包名package redblack),而非redblack_test。这允许测试访问未导出的内部函数和结构,适用于单元测试。

例外情况:当测试文件属于redblack_test包时,仅能测试已导出的API(集成测试场景)。以下是两种方式的对比:

方式一:相同包(推荐用于单元测试)

// red_black_test.go
package redblack

func TestInsert(t *testing.T) {
    tree := &RedBlackTree{} // 可访问未导出结构
    // 测试细节...
}

方式二:独立测试包(用于API测试)

// red_black_test.go
package redblack_test

import (
    "testing"
    "yourmodule/red_black_tree"
)

func TestInsert(t *testing.T) {
    tree := &redblack.RedBlackTree{} // 仅能访问导出类型
}

3. 自动格式化验证

运行以下命令确保符合规范:

# 格式化代码
go fmt ./...

# 验证命名约定(无自动工具,但可通过检查确认)
gofmt -l .  # 列出格式不一致的文件

4. 实际项目参考

查看标准库示例:

# 查看标准库文件命名
ls $GOROOT/src/encoding/json/
# 输出:decode.go encode.go stream.go tags.go ...

# 查看测试文件
ls $GOROOT/src/encoding/json/*test.go
# 输出:decode_test.go encode_test.go ...

遵循这些约定可确保代码与Go生态系统工具链(如go testgo vet)无缝协作,并符合其他开发者的预期。

回到顶部