作用域通路權限:
程式實體通路權限(作用域)有三種:
1. 包級私有(代碼包)
2. 子產品級私有(代碼包)
3. 公開(全域)。
一個函數是一個代碼塊。
一個程式實體的作用域總是會被限制在某個代碼塊中。
好處:控制通路權限, 對“高内聚,低耦合”思想的實踐。
面試題:如果一個變量與其外層代碼塊中的變量重名會出現什麼狀況?
package main
import "fmt"
var block = "package"
func main() {
block := "function"
{
block := "inner"
fmt.Printf("The block is %s.\n", block)
}
fmt.Printf("The block is %s.\n", block)
}
上面代碼能通過編譯。運作後列印内容:
The block is inner.
The block is function.
解析:
對于不同的代碼塊,變量重名沒有什麼大不了,照樣可以通過編譯。
1. 代碼引用變量的時候總會最優先查找目前那個變量。“目前代碼塊”僅僅是引用變量的代碼所在的那個代碼塊,并不包含任何子代碼塊。
2. 如果目前代碼塊中沒有聲明以此為名的變量,程式會沿着代碼塊的嵌套關系,從直接包含目前代碼塊的那個代碼塊開始,一層一層地查找。
查找過程:從小作用域到大作用域
典型回答:
如果變量重名,在全域代碼塊中聲明的變量會被子代碼塊中的重聲明覆寫。
在子代碼塊中聲明的變量,隻能在該代碼塊中生效,使用。
重聲明:
Q:不同代碼塊中的重命名變量與變量重聲明中的變量差別在哪兒?
1. 變量重聲明的變量一定在某一個代碼塊内。不包含它的任何子代碼塊。
2. 變量重聲明是對同一個變量的多次聲明,變量隻有一個。而可重命名變量中涉及的變量肯定是有多個的。
3. 不論對變量重聲明多少次,其類型必須始終一緻。具體遵從第一次被聲明時給定的類型。而可重命名變量無此限制。
4. 可重命名變量在代碼塊之間,存在直接或間接的嵌套關系,存在“屏蔽”的現象。

思考題:如果通過import . xxx 這種導入代碼包中的變量與目前代碼包中的變量重名了,那麼Go語言是會把他們當做“可重名變量”看待還是會編譯報錯呢?
A:會報redeclared錯誤。(變量名大寫)
采用import . xxx,會認為引入的代碼包的代碼,如果在本包中一樣,那作用域其實時同一個,不允許重複聲明。
本學習筆記是僅為了總結自己學到的Go語言核心知識,友善以後回憶,文中部分内容摘錄自極客時間的《Go語言核心36講》專欄,如有侵權,請聯系我删除。
轉載于:https://www.cnblogs.com/fyql/p/10202358.html