结构成员作为参数传递时的范围可见性?

时间:2017-06-21 02:19:32

标签: go

通过传递结构来调用json.Decoder.Decode,例如

type _Sample struct {
    first string // this will not be filled because it starts with lower case letter
    Second string // it is OK. 
}

...
var sample _Sample
err := decoder.Decode(&sample)

根据编写的语言规范:

  

导出的标识符¶

     

可以导出标识符以允许从另一个包访问它。如果两者都导出标识符:

     
      
  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);和
  •   
  • 标识符在包块中声明,或者是字段名称或方法名称。
  •   
     

不会导出所有其他标识符。

问题是结构_Sample未导出,为什么包json可见?

1 个答案:

答案 0 :(得分:2)

时检查

访问权限

  1. 您正在创建/声明变量。编译器将检查类型标识符名称的可见性。
  2. 使用reflect包修改变量。
  3. 调用常量,全局变量或函数。将检查常量/变量/函数名称的可见性。
  4. 创建/定义变量后,当您将此变量作为函数/方法参数传递时,副本(如果是值,则正在复制该值。如果是指针,则正在复制地址)将通过参数名称和类型从函数体传递给函数/方法,始终可访问。在encoding/json包中,Decoder.Decode方法定义为

    func (dec *Decoder) Decode(v interface{}) error
    

    因此,您传递给Decoder.Decode方法的任何内容始终可以通过参数v从方法体内部访问。请注意,v的类型为interface{}而非_Sample结构。将变量定义为

    时,将检查可见性
    var sample _Sample
    

    OK ,因为它是在同一个包中完成的。甚至是匿名结构(即没有为结构定义类型名称标识符)

    aSample := struct {
        first  string // this will not be filled because it starts with lower case letter
        Second string // it is OK.
    }{}
    
    //...
    err := decoder.Decode(&aSample)
    

    会奏效。接下来,当decoder填充结构(通过反射)时,将检查结构成员的可见性,并且_Sample.first包内不可见json