Go 语言严格区分大小写
包括:
- 变量名、函数名、类型名
name
和Name
是两个不同的变量。func Get()
和func get()
是两个不同的函数。
- 包导入路径 (包名)
import "github.com/example/MyPkg"
和import "github.com/example/mypkg"
会被视为不同的包(即使文件系统不区分大小写)。
- 结构体字段名
- JSON/XML 反序列化时,字段名大小写必须匹配:
type User struct { Name string `json:"name"` // 必须和 JSON 的 key 完全一致 Age int `json:"age"` }
- JSON/XML 反序列化时,字段名大小写必须匹配:
- 常量、枚举值
const (A = 1; a = 2)
,A
和a
是不同的常量。
关键影响
1. 编译错误(最常见)
func main() {
var name string
fmt.Println(Name) // 报错:undefined: Name(正确应为 name)
}
2. 包导入失败
- 如果包名是
mypkg
,但代码中写import "Mypkg"
,会报错:cannot find package "Mypkg" in any of...
3. JSON/数据库字段映射问题
type User struct {
Username string `json:"username"`
}
data := `{"UserName": "Alice"}` // 大小写不匹配,反序列化失败
var u User
json.Unmarshal([]byte(data), &u) // u.Username 仍是空值
特殊情况(不区分大小写)
文件名(取决于操作系统)
- Windows/macOS(默认不区分):
main.go
和MAIN.GO
是同一个文件。 - Linux(区分):
main.go
和MAIN.GO
是两个文件。 - 但 Go 工具链建议始终使用小写文件名(如
main.go
)。
- Windows/macOS(默认不区分):
环境变量(Go 不处理,由系统决定)
os.Getenv("PATH")
和os.Getenv("path")
在 Windows 返回相同值,但在 Linux 不同。
最佳实践
统一命名风格
- 变量/函数:驼峰式(如
getUserInfo
)。 - 常量:全大写(如
MAX_SIZE
)。 - 包名:全小写(如
mypkg
)。
- 变量/函数:驼峰式(如
IDE 配置
- VS Code:开启
gopls
的严格大小写检查(默认已启用)。
- VS Code:开启
跨平台注意
- 如果代码可能在 Linux/Windows 共享,避免仅靠大小写区分文件/目录。
测试你是否理解
以下代码能否编译?为什么?
package main
import "fmt"
func main() {
var a int = 1
fmt.Println(A)
}
答案:不能,因为 A
未定义(Go 区分 a
和 A
)。