我們是80後 golang入坑系列

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

現在這個系列,已經開始兩極分化了。 點贊的認為風格輕鬆,看著不困。反之,就有人嫌寫的羅裡吧嗦,上綱上線。所以善意提醒,裡面不只是技術語言,還有段子。專心看技術的,千萬別點!別怪我沒提醒!差點忘說,著作權沒有,轉載隨意,別刪郵箱(ztao8607@gmail.com)

我都承認文章標題起的是越來越扯淡了。從開始的"安裝Golang","解密Golang工程結構"這一類中規中矩的標題,現在已經慢慢進化成了"維多利亞的秘密","我們是80後"這一類相當無技術含義的標題。說實話,我都快編不下去了。

來一段歌詞,看能否勾起你的回憶:

敢在景陽崗上穿虎皮裝。 在高粱地裡套母狼。左手拿刀(挲~),右手拿槍(啪~)。他就是蟑螂中的絕對偶像。敢去皇宮裡翻遍禦膳房。也能到你家裡去掃蕩。就算鞋板兒拍下敵敵畏奪命。死也要死個酷了斃。

早上無意聽到這段<特務小強>的歌詞,感覺一下就回到了上大學的那個時光。 不知道即將步入青年後半段的人,是不是都喜歡懷舊。我的80後記憶還停留在老北京優酪乳,北京即食麵,鐳射錄影廳,世嘉遊戲機。除了二八大杠的單車,就是路邊的遊戲機房。 那會的網吧還都是區域網路在玩紅警,CS剛出來名稱換做反恐精英。沙丘還能找到,但玩最多的當屬金庸群俠傳。

就是在這些遊戲當中,讓我對電腦充滿了好奇,也憧憬著如果有一天我能自己寫個遊戲該有多好。理想一直存在,可現實已被摧殘。看著身邊的90後,00後已經逐漸扛起行業的大梁,只能對著他們感歎一句:

在青年的隊列裡面,我們已經排在了隊尾。好好乾,總有一天,讓我們在隊尾匯合。

感慨已完,開始正題。在維密一節中,我們講到了函數的使用方式,本節聊一聊變數範圍的事情。

變數範圍

綜合之前的描述,我們可以得出一個結論:任何一種語言,都存在變數。 並由此可知,只要有變數,就會有變數範圍。 好比每個國家都有法律,而每個法律都有適用範圍。最簡單的例子就是中國法律管不了美國的事。所以本節聊的就是變數範圍的那些事。

在Golang當中,變數分為三類:

  • 本地局部變數
  • 全域變數
  • 參數變數

本地局部變數,顧名思義只能在本地生效的變數。在Golang當中,本地的定義是按照函數或者語義塊來區分的。只要在一個函數中定義的變數,或者在一個語義塊中定義的變數都是本地變數。

函數定義容易理解,例如下面的例子:

func Test(){    str := "This is a local var"    ....}

str是定義在Test函數內部的變數,因此就是本地變數。下面則是一個語義塊的樣本:

func Test(){    for{        str := "This is a local var in block"        ...    }}

可以看到str是定義在for這個語義塊內部的,因此str也是一個本地變數。 那麼本地變數的範圍在哪裡呢? 哪國的法律管哪國的事,變數定義在哪裡,就在當前範圍內生效。

在樣本一中,str定義在Test函數中,因此在Test函數內部,str都暢通無阻。出了Test函數以後,就無法使用str變數了。 同理可知,在樣本二中,str定義在for迴圈內部,因此只能在for內部使用str。一旦出了for迴圈,同樣也無法再訪問str。

是的,你一定會問,如果出現重名變數怎麼辦? 首先我建議,盡量不要出現重名。 盡量不要自己給自己挖坑。 但非挖不可,那Golang會按照當前範圍優先的原則,替換變數。例如下面的例子:

package mainimport (    "fmt")func main() {    str := "local var"    if true {      str := "block var"      fmt.Println(str)    }    fmt.Println(str)}

在main函數中定義了一個str變數,然後再if語義塊中也定義了一個str變數。按照當前範圍優先的原則,當程式運行到if內部之後,if中的str會替代外部的str變數值。 所以首先輸出"block var'。 當出了if範圍之後,裡面的str已經失效,外部無法訪問。因此最後會使用main函數範圍的str變數,所以輸出"local var"。

因此最終輸出

block varlocal var

還是那句話,代碼最好別用花哨的東西,寫的清清楚楚明明白白最好。一般別挖坑,要挖就挖大坑。

與本地變數相對應的就是全域變數。 只要是在函數外部定義的都屬於全域變數。例如下面的例子:

var g intfunc main(){    a := 10    b := 10    g = a+b    ...}

注意千萬不能g := a+b。 因為我們說過變數的聲明方式有“var"和”:="兩種。如果不小心寫了個" g:=a+b"。雖然對最終的結果沒有影響,但意思已經改變了,變成了在main函數中重新建立了一個g變數。

雖說全域變數也是變數,但全域變數的聲明只能通過var來實現。例如下面是合法的:

var g int或者var g = 40func main(){...}

而下面則是非法的:

g := 40func main(){}

不要問什麼了,規定就是規定,遵守就好。全域變數的範圍當然就是全域了,但這個全域指的是package內。 在當前package內都可以隨意訪問,如果想讓其他package訪問,那麼需要遵從Golang的原則,首字母大寫。這樣才能讓其他Package訪問到。

如果遇到同名問題怎麼樣? Golang同樣會按照範圍優先原則處理,例如下面的例子:

var g = 40func main(){    a := 10    b := 10    g := a+b    ...}

注意,在main函數中,同樣存在一個g變數,但這個g變數是通過":="聲明出來的。 因此按照範圍優先原則,此時此刻的g=30。全域的g=40。 如果這方面感覺不理解,寫兩句代碼,run一下立馬見分曉。

最後一種是參數變數。參數變數是一種特殊的變數,既不屬於本地變數,也不屬於全域變數(有點廢話了,如果屬於就不會單列出來了)。 其介於兩者之間,範圍是函數範圍,先看下面的例子:

func Test(str string){    i := 10    ....}

通過上面的分析可知,i屬於本地變數,而str則屬於參數變數。 與本地變數相同的一點時,其範圍相同,都是函數範圍。 但不同的地方有兩處:

  1. 參數變數賦值是在外部完成的,聯想一下<維密>那節,我們講解函數時,如何給參數賦值。就可以知道賦值的動作是在調用時完成的。
  2. 參數變數可以聲明之後不使用。這點尤為明顯,如果聲明了一個本地變數,但自始至終都沒有用到。編譯時間會提示刪除這個變數。而參數變數,無論函數內部有沒有用到,都不會提示。

所以可以向對待本地局部變數那樣對待參數變數,本地局部變數適用的法則,參數變數同樣適用。

寫完變數,看了看內容不多。因此再多寫一點,反正沒有出版社約稿,也就不會受到大綱的約束,想到哪裡寫到哪裡。

下面進入Golang常用類型的使用情境

String

在每種編程開發語言種,字串都是內建的一種資料類型,原因就是因為它太重要了。前面也提到過一嘴,Golang的字串本質是字元數組([]byte)。

建立字串很簡單,上面用過很多次了:

var greeting = "Hello world!"或者greeting := "Hello world!"

Golang預設使用UTF-8編碼處理字串,所以不用擔心漢字編碼的問題。作為一種現代語言,Golang不限制字串的長度,理論上只要記憶體有多大,字串就可以有多大。但還是本著"no zuo no die"的理念,別放那麼長的字串,沒人喜歡在代碼中讀小說。

Golang專門有一個strings的package(https://golang.org/pkg/strings/ )來處理各種常見的string問題。例如尋找,拼接,判斷,大小寫轉換和替換,拷貝等等常見功能。

String很重要,但真的沒什麼可講的。絕大多數的問題都可以通過strings庫來解決,如果有問題,自行看一下庫文檔吧。 雖說是本系列是個入門教程,但事無巨細都寫完,很不現實。 如果寫完了,那就變成Golang中文文檔了。

所以String這一小節,記住有一個strings庫就夠了。

如果你是80後,真心感歎你還能有如此強的求知慾。 如果你非80後,好好珍惜眼前的日子吧。 該玩就玩,該揮霍就揮霍。別等哪天將髮際線熬到了耳後,才後悔當初沒有好好泡妹子。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.