Go语言 为什么“struct”中的变量需要以大写字母开始?[副本]

xzv2uavs  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(226)

此问题已在此处有答案

Public, Private - Upper Case, Lower Case:(3个答案)
上个月关门了。
当我在学习“A Tour Of Go”的时候,我偶然发现这个“struct”教程中所有的变量名都是以大写字母开始的,像这样:a tour of go: more types

package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
    fmt.Println(Vertex{1, 2})
}

“X”和“Y”是大写字母。
但是,如果我在Vertex结构中使用“x”而不是“X”,程序也会给予正确的输出:{1 2}
那么变量名不使用大写字母有什么区别吗?

gzszwxb4

gzszwxb41#

为什么“struct”中的变量需要以大写字母开始?
它不需要**。正如您所看到的,即使将字段重命名为小写,程序仍然可以编译和运行。因此,这不是一个要求。
那么变量名不使用大写字母有什么区别吗?
是的
以大写字母开始的标识符(包括结构体字段)是exported,以小写字母或下划线开头的标识符是unexported。这类似于其他语言中的privatepublic访问限定符。

  • 导出的标识符可以由任何导入在其中声明了标识符的包的包直接访问。
  • 未导出的标识符 * 仅**可由声明标识符的包直接访问。
  • reflect包对其他包中声明的未导出字段具有只读访问权限,这就是为什么fmt.Println(使用reflect)能够打印Vertex struct{ x, y int }的内容。

参见官方规格:https://go.dev/ref/spec#Exported_identifiers

dba5bblo

dba5bblo2#

据我所知,golang中的命名约定是非常直接的,大写的部分表示可见性:“* 如果一个标识符需要在包外可见,它的第一个字符应该是。如果你不打算在另一个包中使用它,你可以安全地坚持使用mixedCaps。

相关问题