Skip to content

Go语言中内部模块的可见性规则 #106

Description

@MagicalBridge

基本规则:

在Go语言中,内部模块的可见性规则是通过标识符的首字母大小写来控制的。具体规则如下:

首字母大写的标识符

    • 如果一个标识符(如变量、常量、函数、类型、结构体字段等)的首字母是大写的,那么它被认为是导出的(exported)。
    • 导出的标识符可以在包外部访问。也就是说,其他包可以导入这个包并使用这些导出的标识符。

首字母小写的标识符

    • 如果一个标识符的首字母是小写的,那么它被认为是未导出的(unexported)。
    • 未导出的标识符只能在同一个包内部访问。其他包无法直接访问这些标识符。

示例

假设有一个包 mypackage,其中包含以下代码:

package mypackage
// ExportedVar 是一个导出的变量varExportedVar=42// unexportedVar 是一个未导出的变量varunexportedVar=100// ExportedFunc 是一个导出的函数funcExportedFunc() string {
return"Hello, World!"
}
// unexportedFunc 是一个未导出的函数funcunexportedFunc() string {
return"This is private"
}
// MyStruct 是一个导出的结构体typeMyStructstruct {
ExportedFieldstring// 导出的字段unexportedFieldstring// 未导出的字段
}

在另一个包中导入 mypackage 时:

package main
import (
"fmt""mypackage"
)
funcmain() {
// 可以访问导出的变量fmt.Println(mypackage.ExportedVar) // 输出: 42// 不能访问未导出的变量// fmt.Println(mypackage.unexportedVar) // 编译错误: unexportedVar 未导出// 可以调用导出的函数fmt.Println(mypackage.ExportedFunc()) // 输出: Hello, World!// 不能调用未导出的函数// fmt.Println(mypackage.unexportedFunc()) // 编译错误: unexportedFunc 未导出// 可以创建导出的结构体实例s:= mypackage.MyStruct{
ExportedField: "Hello",
// unexportedField: "World", // 编译错误: unexportedField 未导出
}
// 可以访问导出的字段fmt.Println(s.ExportedField) // 输出: Hello// 不能访问未导出的字段// fmt.Println(s.unexportedField) // 编译错误: unexportedField 未导出
}

总结

  • 大写首字母:导出,包外可见。
  • 小写首字母:未导出,仅包内可见。

这种简单的可见性规则使得Go语言的代码组织和模块化非常清晰,同时也鼓励了良好的封装和信息隐藏。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions