为什么我可以这样做
package main
import "fmt"
func main() {
c := Circle{x: 0, y: 0, r: 5}
fmt.Println(c.r)
}
type Circle struct {
x float64
y float64
r float64
}
http://play.golang.org/p/0ypcekVDV9
当我不能对包中的结构做同样的事情时?
如果我尝试访问带有小写字段的结构,则返回编译器错误..
答案 0 :(得分:2)
如果结构与main
函数位于不同的包中,则无法从该主函数访问结构的私有字段。
这就是"私人"装置
答案 1 :(得分:2)
如前所述,需要将字段导出为可从其他包中访问。请参阅spec
导出的标识符
可以导出标识符以允许从另一个标识符访问它 包。如果两者都导出标识符:
- 标识符名称的第一个字符是Unicode大写字母 字母(Unicode类" Lu");
- 并且标识符在。中声明 包块或它是字段名称或方法名称。所有其他 标识符不会导出。
如果您想将字段保密,您需要使用访问者(设置/获取)方法,您可以阅读here
<强>吸气剂强>
Go并不为getter和setter提供自动支持。有&#39; S 自己提供吸气剂和制定者并没有错,而且它也是如此 通常适合这样做,但它既不是惯用的,也不是必需的 将Get放入getter的名字。如果您有一个名为owner的字段 (小写,未导出),getter方法应该称为Owner (大写,导出),而不是GetOwner。使用大写名称 export提供了用于区分字段和方法的钩子。一个 如果需要,setter函数可能会被称为SetOwner。两个名字 在实践中读得很好:
owner := obj.Owner() if owner != user { obj.SetOwner(user) }