[Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
作用域訪問權(quán)限:
程序?qū)嶓w訪問權(quán)限(作用域)有三種:
1. 包級私有(代碼包)
2. 模塊級私有(代碼包)
3. 公開(全域)。
一個函數(shù)是一個代碼塊。
一個程序?qū)嶓w的作用域總是會被限制在某個代碼塊中。
好處:控制訪問權(quán)限, 對“高內(nèi)聚,低耦合”思想的實踐。
面試題:如果一個變量與其外層代碼塊中的變量重名會出現(xiàn)什么狀況?
package mainimport "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) }上面代碼能通過編譯。運行后打印內(nèi)容:
The block is inner. The block is function.解析:
對于不同的代碼塊,變量重名沒有什么大不了,照樣可以通過編譯。
1. 代碼引用變量的時候總會最優(yōu)先查找當前那個變量。“當前代碼塊”僅僅是引用變量的代碼所在的那個代碼塊,并不包含任何子代碼塊。
2. 如果當前代碼塊中沒有聲明以此為名的變量,程序會沿著代碼塊的嵌套關(guān)系,從直接包含當前代碼塊的那個代碼塊開始,一層一層地查找。
查找過程:從小作用域到大作用域
典型回答:
如果變量重名,在全域代碼塊中聲明的變量會被子代碼塊中的重聲明覆蓋。
在子代碼塊中聲明的變量,只能在該代碼塊中生效,使用。
重聲明:
Q:不同代碼塊中的重命名變量與變量重聲明中的變量區(qū)別在哪兒?
1. 變量重聲明的變量一定在某一個代碼塊內(nèi)。不包含它的任何子代碼塊。
2. 變量重聲明是對同一個變量的多次聲明,變量只有一個。而可重命名變量中涉及的變量肯定是有多個的。
3. 不論對變量重聲明多少次,其類型必須始終一致。具體遵從第一次被聲明時給定的類型。而可重命名變量無此限制。
4. 可重命名變量在代碼塊之間,存在直接或間接的嵌套關(guān)系,存在“屏蔽”的現(xiàn)象。
?
思考題:如果通過import . xxx 這種導入代碼包中的變量與當前代碼包中的變量重名了,那么Go語言是會把他們當做“可重名變量”看待還是會編譯報錯呢?
A:會報redeclared錯誤。(變量名大寫)
采用import . xxx,會認為引入的代碼包的代碼,如果在本包中一樣,那作用域其實時同一個,不允許重復聲明。
?
?
?本學習筆記是僅為了總結(jié)自己學到的Go語言核心知識,方便以后回憶,文中部分內(nèi)容摘錄自極客時間的《Go語言核心36講》專欄,如有侵權(quán),請聯(lián)系我刪除。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/fyql/p/10202358.html
總結(jié)
以上是生活随笔為你收集整理的[Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios 性能优化(一)
- 下一篇: Netty源码分析第1章(Netty启动