结构中的私人/公共领域......行为不同

时间:2015-04-16 09:06:25

标签: go

为什么我可以这样做

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

当我不能对包中的结构做同样的事情时?

如果我尝试访问带有小写字段的结构,则返回编译器错误..

2 个答案:

答案 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)
}