为了账号安全,请及时绑定邮箱和手机立即绑定

结构中的私有/公共字段......表现不同

结构中的私有/公共字段......表现不同

Go
翻过高山走不出你 2021-09-27 21:20:37
为什么我可以这样做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)
    }


查看完整回答
反对 回复 2021-09-27
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

如果结构体与main函数位于不同的包中,则您无法从该主函数访问结构体的私有字段。

这就是“私人”的意思。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信