通过传递结构来调用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
可见?
答案 0 :(得分:2)
访问权限
reflect
包修改变量。 创建/定义变量后,当您将此变量作为函数/方法参数传递时,副本(如果是值,则正在复制该值。如果是指针,则正在复制地址)将通过参数名称和类型从函数体传递给函数/方法,始终可访问。在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
。