在 go 语言中,结构体字段是否可被外部包访问,取决于其名称首字母是否为大写(即是否“导出”);同一包内可直接访问所有字段,跨包时仅导出字段(首字母大写)可见。
Go 采用简洁而严格的标识符可见性规则:只有首字母为 Unicode 大写字母(如 A–Z)的标识符才是导出的(exported),才能被其他包访问。这一规则适用于变量、函数、类型、结构体字段和方法名——但不适用于局部作用域内的名称(如函数内声明的变量)。
以你的示例为例:
type Circle struct {
x float64 // 小写 → 未导出 → 包外不可见
y float64 // 同上
r float64 // 同上
}
虽然 main() 函数能成功访问 c.r,是因为它与 Circle 定义位于同一包(main 包)中。Go 的可见性是“包级”的,而非“文件级”或“实例级”。只要在同一包内,无论字段大小写,均可直接读写。