为什么我可以这样做package mainimport "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当我不能对包中的结构做同样的事情时?如果我尝试访问带有小写字段的结构,则会返回编译器错误。
2 回答
ITMISS
TA贡献1871条经验 获得超8个赞
如前所述,需要导出字段才能从另一个包访问。查看规格
导出的标识符
可以导出标识符以允许从另一个包访问它。如果同时满足以下条件,则会导出标识符:
标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);
并且标识符在包块中声明或者它是字段名称或方法名称。不导出所有其他标识符。
如果你想保持字段私有,你需要使用访问器(设置/获取)方法,你可以在这里阅读
吸气剂
Go 不提供对 getter 和 setter 的自动支持。自己提供 getter 和 setter 并没有错,而且这样做通常是合适的,但是将 Get 放在 getter 的名称中既不惯用,也没有必要。如果您有一个名为 owner(小写,未导出)的字段,则 getter 方法应称为 Owner(大写,导出),而不是 GetOwner。使用大写名称导出提供了区分字段和方法的钩子。如果需要,setter 函数可能会被称为 SetOwner。这两个名字在实践中都很好读:
owner := obj.Owner() if owner != user { obj.SetOwner(user) }
- 2 回答
- 0 关注
- 215 浏览
添加回答
举报
0/150
提交
取消