基本规则:在Go语言中,内部模块的可见性规则是通过标识符的首字母大小写来控制的。具体规则如下:首字母大写的标识符:如果一个标识符(如变量、常量、函数、类型、结构体字段等)的首字母是大写的,那么它被认为是导出的(exported)
在Go语言中,内部模块的可见性规则是通过标识符的首字母大小写来控制的。具体规则如下:
首字母大写的标识符:
首字母小写的标识符:
假设有一个包 mypackage
,其中包含以下代码:
package mypackage
// ExportedVar 是一个导出的变量
var ExportedVar = 42
// unexportedVar 是一个未导出的变量
var unexportedVar = 100
// ExportedFunc 是一个导出的函数
func ExportedFunc() string {
return "Hello, World!"
}
// unexportedFunc 是一个未导出的函数
func unexportedFunc() string {
return "This is private"
}
// MyStruct 是一个导出的结构体
type MyStruct struct {
ExportedField string // 导出的字段
unexportedField string // 未导出的字段
}
在另一个包中导入 mypackage
时:
package main
import (
"fmt"
"mypackage"
)
func main() {
// 可以访问导出的变量
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语言的代码组织和模块化非常清晰,同时也鼓励了良好的封装和信息隐藏。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!