版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
05|程序?qū)嶓w的那些事兒(中20180822 就是Go語言在語言層面,依據(jù)代碼塊對程序?qū)嶓w作用域進(jìn)行的定義。比如,我在一個函數(shù)中聲明了一個變量,那么在通常情況下,這個變量是無法被這個函數(shù)以外的代碼引用的。這里的函數(shù)就是一個代碼塊,而變量的作用域被限制在了該代碼塊中。當(dāng)然了,還有例外的情況,這部分內(nèi)容,我留到講函數(shù)的時候再說。我把此題的代碼存到了demo10.go文件中了。你可以在“Golang_Puzzlers”1package23import45varblock=678
main()block:= block:= fmt.Printf("Theblockis%s.\n",14
fmt.Printf("Theblockis%s.\n",這個命令源碼文件中有四個代碼塊,它們是:全域代碼塊、main包代表的代碼塊、main函數(shù)代表的代碼塊,以及在mai函數(shù)中的一個用花括號包起來的代碼塊。值"package"、"function"和"inner"賦給了它們。此外,我在后兩個代碼塊的最后分別嘗試用fmt.Print函數(shù)打印出“Theboks%s.”。這里的“%s”1Theblockis2Theblockisfunctio對于不同的代碼塊來說,其中的變量重名沒什么大不了,照樣可以通過編譯。即使這些代碼塊有直接的嵌套關(guān)系也是如此,就像demo10.gomain包代碼塊、main函數(shù)代碼塊和那個最內(nèi)層的代碼塊那樣。Go還記得嗎?如果我們在當(dāng)前源碼文件中導(dǎo)入了其他代碼包,那么引用其中的程序?qū)嶓w時,是需要以限定符為前綴的。所以程序在找代表變量未加限定符的名字(即標(biāo)識符)但有個特殊情況,如果我們把代碼包導(dǎo)入語句寫成import.XXX比如,如果有代碼包導(dǎo)入語句import.fmt,那么我們在當(dāng)前源碼文件中demo10.go從作用域的角度也可以說,雖然通過varblock"package"聲明的變量作用域是整個相似的,雖然main函數(shù)首先聲明的block的作用域,是整個main函數(shù),但是在最內(nèi)層的那個代碼塊中,它卻是不可能被引用到的。反過來講,最內(nèi)層代碼塊中的block塊之外的代碼引用到,這也是打印內(nèi)容的第二行是“Thebocksfunction.”的另一半原因。碼塊中不允許出現(xiàn)重名的變量,這違背了Go語言的語法。關(guān)于這兩者的表象和機(jī)理,我們變量重聲明中的變量一定是在某一個代碼塊內(nèi)的。注意,這里的“某一個代碼塊內(nèi)”并變量重聲明是對同一個變量的多次聲明,這里的變量只有一個。而可重名變量中涉及的變量肯定是有多個的。不論對變量重聲明多少次,其類型必須始終一致,具體遵從它第一次被聲明時給定的類型。而可重名變量之間不存在類似的限制,它們的類型可以是任意的。如果可重名變量所在的代碼塊之間,存在直接或間接的嵌套關(guān)系,那么它們之間一定會存在“屏蔽”的現(xiàn)象。但是這種現(xiàn)象絕對不會在變量重聲明的場景下出現(xiàn)。43上才能做的操作時,Go語言編譯器一定會告訴你:“這不可以”。Go具體到不同類型的可重名變量的問題上,讓我們先來看一下puzzlers/article5/q2包中的源碼文件demo11.go。它是一個很典型的例子。1package23import45varcontainer=[]string{zero,one,tw6funcmain()containr=map[nt]string{0:zero,1:one,2:twom.Prntf(Theelementis%q.\n,10在demo11.gocontainer的變量,分別位于mai包代碼塊和main函數(shù)代碼塊。main包代碼塊中的變量是切片(slice)類型的,另一個是字典(map)類型的。在mai函數(shù)的最后,我試圖打印出container變量的值中索引為1的那個元素。container[0]。只要中括號里的整數(shù)在有效范圍之內(nèi)([0,2]),它就可以把值中如果containe的類型不是數(shù)組、切片或字典類型,那么索引表達(dá)式就會引發(fā)編譯錯誤。這正是利用Go語言語法,幫我們約束程序的一個例子;但是當(dāng)我們想知道container確切類型的時候,利用索引表達(dá)式的方式就不夠了。我們先討論了代碼塊,并且也談到了它與程序?qū)嶓w的作用域,以及訪問權(quán)限控制之間的巧妙關(guān)系。Go語言本身對程序?qū)嶓w提供了相對粗粒度的訪問控制。但我們自己可以利用代碼塊和作用域精細(xì)化控制它們。如果在具有嵌套關(guān)系的不同代碼塊中存在重名的變量,那么我們應(yīng)該特別小心,它們之間可能會發(fā)生“屏蔽”的現(xiàn)象。這樣你在不同代碼塊中引用到變量很可能是不同的。具體的鑒別方式需要參考Go語言查找(代表了程序?qū)嶓w的)標(biāo)識符的過程。另外,請記住變量重聲明與可重名變量之間的區(qū)別以及它們的重要特征。其中最容易產(chǎn)生隱晦問題的一點(diǎn)是,可重名變量可以各有各的類型。這時候我們往往應(yīng)該在真正使用它們之前先對其類型進(jìn)行檢查。利用Go語言的語法、規(guī)范和命令做輔助的檢查是很好的辦法,但有些時候并不充分。GoimportXXX這種導(dǎo)入代碼包如果通過這種方式導(dǎo)入的代碼包中的變量與當(dāng)前代碼包中的變量重名了,那么Go語言是會Go 04|程序?qū)嶓w的那些事兒(上 06|程序?qū)嶓w的那些事兒(下衡子
154咖啡色的羊...置 采用importxxx如文章所說,基本上就會認(rèn)為引入的代碼包的代碼,如同在本包中一樣,êwěn置 19atompi置 衡子置 6@hl置 lik0914置 1xiaolonghu...置 javaadu置 1云學(xué)置 小小笑兒置 15 1、如果子包中,聲明的變量使用的是小寫,如:varstr="abc",那么,在main包中同 2、如果子包中聲明變量是大寫,如:varStr="abc",在main包中同樣聲明varStr="aaa",IDE工具提示'Str'redeclaredi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年擺攤用具轉(zhuǎn)讓協(xié)議書模板
- 公交勸架調(diào)解協(xié)議書范本模板
- 鈑金工程師合伙協(xié)議書范文模板
- 五金合同協(xié)議書范文電子版
- 一人一半離婚協(xié)議書范文模板
- 旅游景區(qū)消防安全培訓(xùn)
- 酒店前臺員工工作協(xié)議書
- 家委會制度在特殊教育中的應(yīng)用
- 信貸市場競爭專項檢查方案
- 跨文化交流技能比賽方案
- 實(shí)驗《流體壓強(qiáng)與流速的關(guān)系》 課件
- 四年級道德與法治下冊第6課《有多少浪費(fèi)本可避免》第一課時教學(xué)設(shè)計說課稿
- 檢驗檢測服務(wù)項目固定資產(chǎn)和無形資產(chǎn)投資管理
- 6.2 做負(fù)責(zé)任的人
- 設(shè)備安裝施工作業(yè)指導(dǎo)書
- 危險源辨識與風(fēng)險評價記錄表知識講解
- 化工系統(tǒng)工程:第4章 換熱網(wǎng)絡(luò)綜合
- 醫(yī)院感染管理組織架構(gòu)圖
- 示范區(qū)標(biāo)識及精神堡壘、文化墻施工方案
- (完整版)國家會計領(lǐng)軍人才題型及經(jīng)驗分享
- 6.2做負(fù)責(zé)任的人課件(25張PPT)
評論
0/150
提交評論