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 設計:通過將某些函數和類型字段標記為 導出 或 未導出,你可以更清晰地設計包的公共接口,并防止外部包訪問不該訪問的內部實現。