我们知道,以大写字母开头的字段是public的,而不是private的。但是Golang也支持匿名字段。例如:
type myType struct { string }
这些字段是为Embedding设计的。但是这个字段是公共的还是私有的?
ercv8c1e1#
根据结构类型的规范:使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称T或指向非接口类型名称 *T的指针,并且T本身可能不是指针类型。非限定类型名称用作字段名称。string的非限定名称为string。根据导出标识符的规范:可以导出标识符以允许从另一个包访问它。如果存在以下情况,则导出标识符:1.标识符名称的第一个字符是Unicode大写字母(Unicode字符类别Lu);和1.标识符在包块中声明,或者它是字段名或方法名。string的第一个字符不是Unicode大写字母。嵌入的字段不会被导出,换句话说,它是包的私有字段。
string
bjp0bcyl2#
如果嵌入类型的typename为小写,则它具有包可见性。例如:
type T struct { string } func main() { x := T{} x.string = "a" fmt.Println(x) }
但是,如果将类型T移动到另一个包p:
T
p
package p type T struct { string }
package main import "testmod/p" func main() { x := p.T{} x.string = "a" // Error }
2条答案
按热度按时间ercv8c1e1#
根据结构类型的规范:
使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称T或指向非接口类型名称 *T的指针,并且T本身可能不是指针类型。非限定类型名称用作字段名称。
string
的非限定名称为string
。根据导出标识符的规范:
可以导出标识符以允许从另一个包访问它。如果存在以下情况,则导出标识符:
1.标识符名称的第一个字符是Unicode大写字母(Unicode字符类别Lu);和
1.标识符在包块中声明,或者它是字段名或方法名。
string
的第一个字符不是Unicode大写字母。嵌入的字段不会被导出,换句话说,它是包的私有字段。
bjp0bcyl2#
如果嵌入类型的typename为小写,则它具有包可见性。例如:
但是,如果将类型
T
移动到另一个包p
: