{"author":{"address":null,"user":"https://learnblockchain.cn/people/20334"},"content":{"body":"## 基本规则：\r\n\r\n在Go语言中，内部模块的可见性规则是通过标识符的首字母大小写来控制的。具体规则如下：\r\n\r\n**首字母大写的标识符**：\r\n\r\n-   -   如果一个标识符（如变量、常量、函数、类型、结构体字段等）的首字母是大写的，那么它被认为是**导出的**（exported）。\r\n    -   导出的标识符可以在**包外部**访问。也就是说，其他包可以导入这个包并使用这些导出的标识符。\r\n\r\n**首字母小写的标识符**：\r\n\r\n-   -   如果一个标识符的首字母是小写的，那么它被认为是**未导出的**（unexported）。\r\n    -   未导出的标识符只能在**同一个包内部**访问。其他包无法直接访问这些标识符。\r\n\r\n## 示例\r\n\r\n假设有一个包 `mypackage`，其中包含以下代码：\r\n\r\n```go\r\npackage mypackage\r\n\r\n// ExportedVar 是一个导出的变量\r\nvar ExportedVar = 42\r\n\r\n// unexportedVar 是一个未导出的变量\r\nvar unexportedVar = 100\r\n\r\n// ExportedFunc 是一个导出的函数\r\nfunc ExportedFunc() string {\r\n    return \"Hello, World!\"\r\n}\r\n\r\n// unexportedFunc 是一个未导出的函数\r\nfunc unexportedFunc() string {\r\n    return \"This is private\"\r\n}\r\n\r\n// MyStruct 是一个导出的结构体\r\ntype MyStruct struct {\r\n    ExportedField   string // 导出的字段\r\n    unexportedField string // 未导出的字段\r\n}\r\n```\r\n\r\n在另一个包中导入 `mypackage` 时：\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    \"mypackage\"\r\n)\r\n\r\nfunc main() {\r\n    // 可以访问导出的变量\r\n    fmt.Println(mypackage.ExportedVar) // 输出: 42\r\n\r\n    // 不能访问未导出的变量\r\n    // fmt.Println(mypackage.unexportedVar) // 编译错误: unexportedVar 未导出\r\n\r\n    // 可以调用导出的函数\r\n    fmt.Println(mypackage.ExportedFunc()) // 输出: Hello, World!\r\n\r\n    // 不能调用未导出的函数\r\n    // fmt.Println(mypackage.unexportedFunc()) // 编译错误: unexportedFunc 未导出\r\n\r\n    // 可以创建导出的结构体实例\r\n    s := mypackage.MyStruct{\r\n        ExportedField: \"Hello\",\r\n        // unexportedField: \"World\", // 编译错误: unexportedField 未导出\r\n    }\r\n\r\n    // 可以访问导出的字段\r\n    fmt.Println(s.ExportedField) // 输出: Hello\r\n\r\n    // 不能访问未导出的字段\r\n    // fmt.Println(s.unexportedField) // 编译错误: unexportedField 未导出\r\n}\r\n```\r\n\r\n## 总结\r\n\r\n-   **大写首字母**：导出，包外可见。\r\n-   **小写首字母**：未导出，仅包内可见。\r\n\r\n这种简单的可见性规则使得Go语言的代码组织和模块化非常清晰，同时也鼓励了良好的封装和信息隐藏。","title":"Go语言中内部模块的可见性规则"},"history":null,"timestamp":1734691171,"version":1}