Go语言初识--标识符 可见性
Go语言初识–标识符 可见性
和C语言相似,go语言的基本组成有:
- 包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。
- 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。
- 函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。
- 变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
- 语句/表达式,在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
- 注释,和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
标识符
标识符(Identifier)是程序中用来命名实体(如变量、函数、类型、常量、结构体字段等)的名字。在 Go 语言中,标识符的命名遵循以下规则:
-
组成部分:
- 标识符由字母、数字和下划线
_
组成。 - 标识符的第一个字符必须是字母(
a-z
、A-Z
)或下划线_
,不能是数字。
例如:
var valid1 int // 合法 var 1invalid int // 不合法,不能以数字开头 var _validName int // 合法
- 标识符由字母、数字和下划线
-
大小写:
- 大写字母开头的标识符被认为是 导出 的(即在其他包中可见)。
- 小写字母开头的标识符是 未导出 的,只能在当前包内访问。
Go 语言中的可见性规则(导出与未导出):
1. 导出标识符(Exported Identifier):
- 大写字母开头的标识符可以被外部包访问,也就是说,这种标识符对外部包是 可见的。
- 这与其他语言中的 public 类似,例如 Java 或 C++ 中的公共成员。
示例:
// 定义一个结构体和函数,结构体字段和函数名首字母大写,表示它们是导出的
package mypackage// 导出字段
type MyStruct struct {Name string
}// 导出函数
func MyFunction() {fmt.Println("This is a public function!")
}
在这个示例中,MyStruct
结构体和其字段 Name
,以及 MyFunction
函数都可以被外部包使用:
package mainimport "mypackage"func main() {var s mypackage.MyStructs.Name = "Hello" // 可以访问 Name 字段,因为它是导出的mypackage.MyFunction() // 可以调用 MyFunction,因为它是导出的
}
MyStruct
和MyFunction
是 导出 的,因为它们的名字以大写字母开头,其他包可以直接访问它们。
2. 未导出标识符(Unexported Identifier):
- 小写字母开头的标识符是 未导出 的,只能在定义它的包内访问,外部包无法直接访问。
- 这类似于其他语言中的 private 或 protected 成员。
示例:
package mypackage// 未导出字段
type MyStruct struct {name string // 小写字母开头,表示未导出
}// 未导出函数
func myFunction() {fmt.Println("This is a private function!")
}
在这个示例中,MyStruct
的 name
字段和 myFunction
函数都是 未导出 的,它们只能在 mypackage
包内部使用,其他包无法访问:
package mainimport "mypackage"func main() {var s mypackage.MyStructs.name = "Hello" // 错误:无法访问未导出的字段 'name'mypackage.myFunction() // 错误:无法调用未导出的函数 'myFunction'
}
- 由于
name
字段和myFunction
函数都是小写字母开头,表示它们是 未导出 的,外部包无法访问。
总结:
-
标识符组成:Go 中的标识符由字母、数字和下划线组成,但首字符必须是字母或下划线。
-
导出和未导出:
-
大写字母开头的标识符(如
MyStruct
、MyFunction
)是 导出的,可以被外部包访问。 -
小写字母开头的标识符(如
name
、myFunction
)是 未导出的,只能在当前包内访问。 -
导出:类似于其他语言中的
public
,表示对外部可见。 -
未导出:类似于其他语言中的
private
,表示对外部不可见。
-
为什么这个规则很重要?
- 封装性:Go 使用这种规则来实现封装,只暴露给外部包必要的功能,而隐藏包内部的实现细节。
- API 设计:通过将某些函数和类型字段标记为 导出 或 未导出,你可以更清晰地设计包的公共接口,并防止外部包访问不该访问的内部实现。