Go语言 匿名字段是public还是private?

h9a6wy2h  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(132)

我们知道,以大写字母开头的字段是public的,而不是private的。但是Golang也支持匿名字段。例如:

type myType struct {
  string
}

这些字段是为Embedding设计的。但是这个字段是公共的还是私有的?

ercv8c1e

ercv8c1e1#

根据结构类型的规范:
使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称T或指向非接口类型名称 *T的指针,并且T本身可能不是指针类型。非限定类型名称用作字段名称。
string的非限定名称为string
根据导出标识符的规范:
可以导出标识符以允许从另一个包访问它。如果存在以下情况,则导出标识符:
1.标识符名称的第一个字符是Unicode大写字母(Unicode字符类别Lu);和
1.标识符在包块中声明,或者它是字段名或方法名。
string的第一个字符不是Unicode大写字母。
嵌入的字段不会被导出,换句话说,它是包的私有字段。

bjp0bcyl

bjp0bcyl2#

如果嵌入类型的typename为小写,则它具有包可见性。例如:

type T struct {
    string
}

func main() {
    x := T{}
    x.string = "a"
    fmt.Println(x)
}

但是,如果将类型T移动到另一个包p

package p

type T struct {
  string
}
package main

import "testmod/p"

func main() {
    x := p.T{}
    x.string = "a" // Error
}

相关问题