Go語言學習 二十五 Go中的作用域

本文最初發表在我的個人博客,查看原文,獲得更好的閱讀體驗


在Go中,聲明標識符的作用範圍是源文件的範圍,其中標識符表示指定的常量、類型、變量,函數、標籤或包等。

一 作用域

Go使用塊的詞法來管理作用域:

  1. 預聲明的標識符的範圍是全局的(哪都可以用)。
  2. 頂層(在任何函數之外)聲明的常量,類型,變量或函數(但不是方法)的標識符的範圍是包級別。
  3. 導入包的作用域是包含導入包聲明的文件範圍
  4. 方法接收者,函數參數或結果變量的標識符的作用域是函數體。
  5. 在函數內聲明的常量或變量標識符的範圍從ConstSpec或VarSpec(短變量聲明的ShortVarDecl)結尾處開始,並在最內層包含塊的末尾結束。
  6. 在函數內聲明的類型標識符的範圍從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 .

二 標籤作用域

標籤由帶標籤的語句聲明,用於breakcontinuegoto語句。與其他標識符相比,標籤不是塊作用域,也不與非標籤的標識符衝突。標籤的範圍是聲明它的函數體,並排除任何嵌套函數體。

三 預聲明標識符

以下標識符隱式聲明爲全局的:

類型:
	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

四 可導出標識符

可導出標識符滿足以下兩點:

  1. 標識符名稱的第一個字符是Unicode大寫字母,並且
  2. 標識符在包塊中聲明,或者是字段名或方法名。

除此之外所有其他標識符都不會導出。

五 標識符的唯一性

給定一組標識符,如果其中一個標識符與集合中其他任何一個都不同,則稱其爲唯一標識符。如果兩個標識符拼寫不同,或者出現在不同的包中且均未導出,則它們是不同的,否則就是一樣的。

參考:
https://golang.org/ref/spec#Declarations_and_scope

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章