本文最初發表在我的個人博客,查看原文,獲得更好的閱讀體驗
在Go中,聲明標識符的作用範圍是源文件的範圍,其中標識符表示指定的常量、類型、變量,函數、標籤或包等。
一 作用域
Go使用塊的詞法來管理作用域:
- 預聲明的標識符的範圍是全局的(哪都可以用)。
- 頂層(在任何函數之外)聲明的常量,類型,變量或函數(但不是方法)的標識符的範圍是包級別。
- 導入包的作用域是包含導入包聲明的文件範圍
- 方法接收者,函數參數或結果變量的標識符的作用域是函數體。
- 在函數內聲明的常量或變量標識符的範圍從ConstSpec或VarSpec(短變量聲明的ShortVarDecl)結尾處開始,並在最內層包含塊的末尾結束。
- 在函數內聲明的類型標識符的範圍從TypeSpec中的標識符開始,並在最內層包含塊的末尾結束。
ConstSpec,VarSpec,TypeSpec等是指聲明中的Spec:
常量聲明的格式如下:ConstDecl = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) . ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] . IdentifierList = identifier { "," identifier } . ExpressionList = Expression { "," Expression } .
變量聲明如下:
VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) . VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
類型聲明如下:
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) . TypeSpec = AliasDecl | TypeDef .
短變量聲明如下:
ShortVarDecl = IdentifierList ":=" ExpressionList .
二 標籤作用域
標籤由帶標籤的語句聲明,用於break
,continue
和goto
語句。與其他標識符相比,標籤不是塊作用域,也不與非標籤的標識符衝突。標籤的範圍是聲明它的函數體,並排除任何嵌套函數體。
三 預聲明標識符
以下標識符隱式聲明爲全局的:
類型:
bool byte complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr
常量:
true false iota
零值:
nil
函數:
append cap close complex copy delete imag len
make new panic print println real recover
四 可導出標識符
可導出標識符滿足以下兩點:
- 標識符名稱的第一個字符是Unicode大寫字母,並且
- 標識符在包塊中聲明,或者是字段名或方法名。
除此之外所有其他標識符都不會導出。
五 標識符的唯一性
給定一組標識符,如果其中一個標識符與集合中其他任何一個都不同,則稱其爲唯一標識符。如果兩個標識符拼寫不同,或者出現在不同的包中且均未導出,則它們是不同的,否則就是一樣的。