Go 包、导入与可见性
Go 如何用 package 组织代码、用 import 建立依赖,以及通过标识符首字母大小写控制导出可见性。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 语言基础 MOC
- 所属 MOC: Go 工具链与工程结构 MOC
- 前置概念: Go 程序结构
- 并列概念: Go Modules, Go 接口
Go 包、导入与可见性
一句话定义
Go 通过包来组织代码和建立边界,通过导入来声明依赖,通过标识符首字母大小写来表达对外可见性。
核心机制 / 工作原理
Go 的几个基本规则:
- 一个目录通常对应一个包
- 源文件开头写
package xxx - 通过
import使用其他包 - 首字母大写的标识符可导出,首字母小写的只在包内可见
这种设计很朴素,但非常重要,因为它把“抽象边界”压缩成一套容易读懂的规则,而不是复杂访问修饰符系统。
最小例子 / 最小场景
package user
type Profile struct {
Name string
}
func NewProfile(name string) Profile {
return Profile{Name: name}
}
func normalizeName(name string) string {
return strings.TrimSpace(name)
}
在这个例子里:
Profile和NewProfile对包外可见normalizeName只在包内可见
为什么这部分重要
Go 项目可读性很大程度取决于包边界是否清晰。一个包应该表达一组紧密相关的能力,而不是随手堆函数。
边界与易混淆点
- 可导出不等于必须导出,很多实现细节应该保留包内
- 包名一般短小直接,不应该像 Java 那样层层拉长
- 包和模块不是一个层级的概念:包偏代码组织,模块偏依赖发布