史前摘要: 本來想寫讀前必讀,但連續幾篇博文都寫讀前必讀,感覺就沒有了新意。 所以換成史前摘要,反正是一個意思。 此摘要的目的仍然是提醒點擊而來的同學,本系列最新文章在這里。放到博客園的目的是為了方便不能翻牆的同學查看。 有人說寫的太膚淺沒意思,我的回答是,飯有粗茶咸淡,味有酸甜苦辣,蘿卜青菜各有所愛。沒轍,本人也就這點能耐了,耐看您就多看點,不耐看,呵呵,那我也改不了啦。
好,史前的話說完了,下面開始史后的話。
樹活一張皮,人活一張臉。文章好不好,標題最重要。光起名就想了10幾分鍾,中國漢語博大精深,但適合做技術類標題的真心太難想了。標題不夠,寫詩來湊,所以來段繞口小段子算是開場:
守法朝朝憂悶,強盜夜夜歡歌。 損人利己騎馬騾,正直公平卻挨餓。 修橋補路瞎眼人,殺人放火事兒真多。我到西天問我佛,佛說:我TM也沒轍。
看完,樂完。收拾心情,開始繼續學Golang。
在上一節,你學會了寫第一個Golang程序,也知道了Golang的程序結構。我不知道你是什么技術背景,也不知道有多少編碼功底。所以有的地方寫的比較啰嗦,懂了,就一笑而過。不懂,就好好看一下。知識多了,不丟人。不懂裝懂,最可怕。
這一節,你將接觸到Golang的基本數據類型。
自打有編程語言開始,基本類型就三類:布爾,字符/字符串,數值(和其它)。不同的語言,對類型有不同的分類標准,就會衍生出更為細致的分類,但本質就這么三類。其它語言,咱先不管。先來看看Golang的類型划分:
- 布爾類型
只有兩個值,true或者false。記住只有這兩個值。別的語言可以通過0或者1來充當布爾判斷,但在golang里面不行(筆桿子出真理,不行就自己寫個代碼來驗證一下)。golang只認true or false。
- 字符/字符串
字符多了就是字符串。 從內存上來說,字符串就是內存中連續排列的字符的集合。在內存當中保存的都是01這樣的二進制,不會保留一個漢字或者字母。所以每個字符都對應着一個數字,這個數字就是ASCII碼里面的值。比如十進制的33就是'!'。雖然字符對應的是數字,但Golang仍然賦予字符一個特定的類型叫做byte。你可以這么定義一個字符:
var c byte
c = 33
字符多了就是串,所以字符串類型string也可以理解成是[]byte(byte數組)。提醒一點,Golang的字符串是不可更改的。 記住即可,日常中不會體會到,除非裝X較真的時候(比如面試)會提到。這里的不可更改指的是下面的場景:
str := "Who said string cannot change?"
str = "I don't konw"
str仍然是哪個str,但str指向的內存地址已經變了。str只是一個名字,一個代號而已,拿掉這個代號,str又是什么東西(寫這段的時候,剛好旁邊在放武林外傳呂秀才口擒姬無命那段,所以直接用了,應該沒有版權問題)? 上面說到字符串是內存中連續的字符集合,所以當你對字符串修改時,其實是將一段新的內存給了str。因此才會說字符串是不可更改的。因為從來都是給它賦新值,舊值直接被垃圾回收了。 這段記住即可,除了面試,其它沒有會被提到的場合。
- 數值類型
這個類型需要好好說一下了,因為衍生的類型太多了。但多歸多,真正使用的就那么幾個(誰用誰知道)。
整型值 |
---|
序號 | 類型和取值范圍 |
---|---|
1 | uint8 無符號8位整型 (0 to 255) |
2 | uint16 無符號16位整型 (0 to 65535) |
3 | uint32 無符號32位整型 (0 to 4294967295) |
4 | uint64 無符號64位整型 (0 to 18446744073709551615) |
5 | int8 有符號8位整型 (-128 to 127) |
6 | int16 有符號16位整型 (-32768 to 32767) |
7 | int32 有符號32位整型 (-2147483648 to 2147483647) |
8 | int64 有符號64位整型 (-9223372036854775808 to 9223372036854775807) |
一句話點明:無符號整型只能表示正數,有符號的可以表示負數。但數的個數是相同的(自己找個筆頭,算算二進制就知道了)
浮點數 |
---|
符號 | 類型和取值范圍 |
---|---|
1 | **float32 **32位浮點數 |
2 | **float64 **64位浮點數 |
3 | **complex64 **實部虛部都是一個float32的復數 |
4 | **complex128 **實部虛部都是一個float64的復數 |
Golang里面沒有float類型,所以需要浮點數的時候需要指明長度。 除了計算和錢有關的程序(計算利息,收益等等),基本上很少會用到浮點數。
其它數值類型 |
---|
序號 | 類型 |
---|---|
1 | byte等同於uint8 |
2 | rune等同於 int32 |
3 | **uint **等同於 32 or 64 bits |
4 | **int **等同於 uint |
5 | uintpt 指針類型 CGO里面經常用到 |
上面列出了Golang當中所有的數值類型,大部分而且是絕大部分是不常用到的。經常用的就是int, byte再加上float32/64,沒有其它。
甚至有的時候,你都不知道用的是什么類型,例如:
i := 0
很可能你就直接聲明了一個變量。這個變量什么類型, who care? 不能說你錯,因為我也經常這么干。但我知道i 是int型🙄。 剛開始寫golang,別被老司機帶壞了。老老實實的聲明變量類型,等你變老了,再去調戲小姑娘
var i int
i = 0
沒有人會問到常量么? 在有的文章或者教程中,常量也被歸納到類型中.Golang官方里面沒有這么提,所以尊重原創,我也不認為常量算是一種類型。
變量
類型是為變量服務的,類型是衣,變量是皮。前面你所寫的golang代碼中已經有變量了,但卻只其有而不知它為啥有,看下面就讓你知道變量是怎么回事。
說的官方點,變量只不過是給程序可以操作的存儲區域的名稱而已。Go中的每個變量都有一個特定類型,該類型決定變量內存的大小和布局,可以存儲在該內存中的值的范圍,以及可以應用於該變量的操作集。
這種話,說出來都繞口。 通俗大白話,變量就是一種保存在內存里的數據結構。
變量名只能有字母,數字或者下划線來組成。但必須以字母或者下划線開頭,別找事,用數字開頭。那就是自己挖坑自己遭殃。自己作孽自己die。因為Golang對大小寫敏感,所以首字母是否要大寫,根據是否可見來判斷。 如果不保准,就小寫。等着后悔了,改成大寫也來得及。
Golang也允許定義各種其他類型的變量,例如枚舉、指針、數組、結構和Union,為了體現本書內容的厚度,我們放在以后的章節中討論這些變量。在本章中,將只關注基本的變量類型。
聲明變量的基本格式是:
var 變量名稱 變量類型
也可以采用:
變量名稱 := 初始值
但還是那句話,沒練成老司機,就別調戲小姑娘。老老實實的用第一種吧。如果某天看到下面的聲明方式也別奇怪:
var i, j, k int
golang支持同時聲明多個變量。 上面就聲明了三個i、j和k三個int類型的變量。一般來說,聲明完之后,就擇機進行初始化。
i = 4
j,k = 5,6
可以單獨給某個變量賦值,也可以同時給多個變量賦值。 喜歡哪個就用哪個,高興就好。
像這種通過var來聲明的變量,稱之為靜態變量。 也就是編譯器在編譯階段就可以知道數據類型的變量。 反之就是動態變量,也就是通過 i := 0這種,運行時才能推導出變量類型。 不用擔心,兩者在效率上是否有區別。 現在的CPU老牛X了,不在乎這點差距。
介紹完常規命名方式,下面來介紹個"孔乙己"式的方式:
var a, b, c = 3, 4, "foo"
花哨不實用,知道即可。非要練,請自便~ 小心被團隊里的其它人打折腿。
Golang的變量還是很簡單的,實用的就那么幾招,學會了就真的學會了,沒有花架子。
本節起名是准備沖鋒。沖鋒之前,送你一把稱心稱手的兵器。介紹一個IDE
Goland
IDE大廠JetBrains推出的專業Golang IDE。 現在還是預覽版,所以不要錢。 趁着免費趕緊用吧。當哪天收費了,擼起袖子去找破解Key吧。
安裝好Goland之后,基本上什么都不需要配置,開箱既用。唯獨需要你自己維護一下GOPATH。 不知道何為GOPATH? 老鐵,上點心,別吃完飯就忘... 翻到前面幾節復習一下。
Goland的GOPATH設置在Preferences --> Go --> GOPATH. 里面有全局GOPATH也有項目GOPATH,根據自己的需要,自己維護一下。如果心情好,可以順手去維護了GOROOT。反正是no zuo no die。 工程跑不起來,還是自己受傷💔。
所以只維護GOPATH就好。
第一式,亢龍有悔就結束了。 入門沒入門? 沒入門... 再從第一節讀一遍,保證入門。 入了門? 看看有沒有點star,沒點趕緊點一個。每節最后我都提示一下,反正是為了湊字數..