Go 语言严格区分大小写

包括:

  1. 变量名、函数名、类型名
    • nameName 是两个不同的变量。
    • func Get()func get() 是两个不同的函数。
  2. 包导入路径 (包名)
    • import "github.com/example/MyPkg"import "github.com/example/mypkg" 会被视为不同的包(即使文件系统不区分大小写)。
  3. 结构体字段名
    • JSON/XML 反序列化时,字段名大小写必须匹配:
      type User struct {
          Name string `json:"name"`  // 必须和 JSON 的 key 完全一致
          Age  int    `json:"age"`
      }
  4. 常量、枚举值
    • const (A = 1; a = 2)Aa 是不同的常量。

关键影响

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 仍是空值

特殊情况(不区分大小写)

  1. 文件名(取决于操作系统)

    • Windows/macOS(默认不区分):main.goMAIN.GO 是同一个文件。
    • Linux(区分):main.goMAIN.GO 是两个文件。
    • 但 Go 工具链建议始终使用小写文件名(如 main.go)。
  2. 环境变量(Go 不处理,由系统决定)

    • os.Getenv("PATH")os.Getenv("path") 在 Windows 返回相同值,但在 Linux 不同。

最佳实践

  1. 统一命名风格

    • 变量/函数:驼峰式(如 getUserInfo)。
    • 常量:全大写(如 MAX_SIZE)。
    • 包名:全小写(如 mypkg)。
  2. IDE 配置

    • VS Code:开启 gopls 的严格大小写检查(默认已启用)。
  3. 跨平台注意

    • 如果代码可能在 Linux/Windows 共享,避免仅靠大小写区分文件/目录

测试你是否理解

以下代码能否编译?为什么?

package main

import "fmt"

func main() {
    var a int = 1
    fmt.Println(A)
}

答案:不能,因为 A 未定义(Go 区分 aA)。