一直在 Segment Fault 上面實行自己的拿來主義,但其實我是一直很樂意分享的人,而且特別喜歡寫,以前一直都是在自己的部落格裡面寫,但是沒啥人看,也形成不了交流,所以,申請在 Segment Fault 上面開個專欄,以後還忘大家多多指教,這篇文章只是想試試 Segment Fault的編輯器,內容是前幾天寫的。
Go語言的語言符號又稱記法元素,共包括5類,標籤符(identifier
)、關鍵字(keyword
)、操作符(operator
)、分隔符(delimiter
)、字面量(literal
),它們是組成Go語言程式碼和程式的最基本單位。
Go語言的所有原始碼都必須由 Unicode
編碼規範的 UTF-8 編碼格式進行編碼。
一、識別符號
在Go語言程式碼中,每一個識別符號可以代表一個變更或者一個型別(即識別符號可以被看作是變數或者型別的代號或者名稱),識別符號是由若干字母、下劃線(_)和數字組成的字元序列,第一個字元必須為字母。同時,使用一個識別符號在使用前都必須先宣告。在一個程式碼塊中,不允許重複宣告同一個標識。
程式碼包宣告(
package PKG_NAME
)並不算是一個宣告,因為程式碼包名稱並不出現在任何一個作用域中,程式碼包宣告語句的目的只是為了鑑別若干原始碼檔案是否屬於同一個程式碼包,或者指定匯入程式碼包時的預設程式碼包引用名稱。一個限定識別符號代表了對另一個程式碼包中的某個識別符號的訪問,這需要兩個條件:
- 另一個程式碼包必須事情由Go語言的匯入宣告
import
匯入;- 某個識別符號在程式碼包中是可匯出的。
識別符號可匯出的前提條件有下面這兩個:
- 識別符號名稱中的第一個字元必須是大寫;
- 標識必須是被宣告在一個程式碼包中的變數或者型別的名稱,或者是屬於某個結構體型別的欄位名稱或者方法名稱。
在Go語言中還存在一類特殊的識別符號,叫作預定義識別符號,這類識別符號隨Go語言的原始碼一同出現,主要包括以下幾種:
- 所有基本資料型別的名稱
- 介面型別
error
- 常量
true
、false
以及iota
- 所有內奸函式的名稱,即
append
、cap
、close
、complex
、copy
、delete
、imag
、len
、make
、new
、panic
、print
、println
、real
和recover
由一個下劃線表示的標識 _ 為空識別符號,它一般被用在一需要引入一個新繫結宣告中,如:
import _ "runtime/cgo"
二、關鍵字
關鍵字是指被程式語言保留頁不讓程式設計人員作為識別符號使用的字元序列。因此,關鍵字也稱為保留字。
Go 語言中所有的關鍵只有25個:
- 程式宣告:
import
、package
- 程式實體宣告和定義:
chan
、const
、func
、interface
、map
、struct
、type
、var
- 程式流程控制:
go
、select
、break
、case
、continue
、default
、defer
、else
、fallthrough
、for
、goto
、if
、range
、return
、switch
三、字面量
簡單來說,字面量就是表示值的一種標記法,但是在Go語言中,字面量的含義要更廣一些:
- 用於表示基礎資料型別值的各種字面量。
-
使用者構造各種自定義的複合資料型別的型別字面量,如下面這個字面量表示了一個名稱為 Person 的自定義結構體型別:
type Person struct { Name string Age uint8 Address string }
-
用於表示複合資料型別的值的複合字面量,更確切地講,它會被用來構造型別 Struct(結構體)、Array(陣列)、Slice(切片)和Map(字典)的值。如下面的字面量可以表示上面的那個 Person 結構體型別的值:
Person(Name: "Eric Pan", Age: 28, Address: "Beijing China"}
四、型別
一個型別確定了一類值的集合,以及可以在這些值上施加的操作。型別可以由型別名稱或者型別字面量指定,型別分為基本型別和複合型別,基本型別的名稱可以代表其自身,比如:
var name string
string 即為一個基本型別,Go 語言中的基本型別有:bool、byte、int/uint、int8/uint8、int16/uint16、int32/uint32、int64/uint64、float32、float64、complex64、complex128,共18個,基本型別的名稱都必須預定義識別符號。除了 bool 與 string 外,其它的都稱為數值型別。
除了基本型別外,Go語言還有八個複合型別:Array(陣列)、Struct(結構體)、Function(函式)、Interface(介面)、Slice(切片)、Map(字典)、Channel(通道)以及Pointer(指標)。
複合型別一般由若干(包括0)個其他已被定義的型別組合而成,如定義一本書的結構體:
type Book struct {
Name string
ISBN string
Press string
TotalPages uint16
}
Go語言中的型別又可以分為靜態型別和動態型別,一個變數的靜態型別是指在變數宣告中示出的那個型別,絕大多數型別的變數都只擁有靜態型別,唯獨介面型別的變數例外,它除了擁有靜態型別之外,還擁有動態型別,這個動態型別代表了在執行時與該變數繫結在一起的值的實際型別。
每一個型別都會有一個潛在型別,如果這個型別是一個預定義的型別(也就是基本型別),或者是一個由型別字面量構造的複合型別,那麼它的潛在型別就是它自身,比如 string 型別的潛在型別就是 string,在上面提到的 Book 的潛在型別就是 Book,但是如果一個型別並不屬於上述情況,那麼這個型別的潛在型別就是在型別宣告中的那個型別的潛在型別,比如我們按以下方式宣告一個 MyString 型別:
type MyString string
MyString 型別的潛在型別就是 string 型別的潛在型別,實際上,我們可以將 MyString 看作是 string 型別的一個別名,在Go 語言中的基本資料型別 rune 型別就是如此,它可以看作是 uint32 型別的一個別名型別,其潛在型別就是 uint32 ,但是一類要注意, MyString 與 string 卻並不是一個相同的型別。
潛在型別在宣告過程中是具有可傳遞性的,如下面我們再宣告一個 iString 型別:
type iString MyString
iString 型別的潛在型別同樣就是 string 型別。