build-web-application-with-golang筆記

2.2 Go基礎

1. :=這個符號直接取代了var和type,這種形式叫作簡短聲明。不過它有一個限制,那就是它只能用在函數內部;在函數外部使用則會沒法編譯經過,因此通常用var方式來定義全局變量。 數組

2. rune是int32的別稱,byte是uint8的別稱。不一樣類型的變量之間不容許互相賦值或操做,否則會在編譯時引發編譯器報錯。 數據結構

3. 儘管int的長度是32 bit, 但int 與 int32並不能夠互用。浮點數的類型有float32和float64兩種(沒有float類型),默認是float64。 app

4. 大寫字母開頭的變量是可導出的,也就是其它包能夠讀取的,是公用變量;小寫字母開頭的就是不可導出的,是私有變量。 函數

5. 大寫字母開頭的函數也是同樣,至關於class中的帶public關鍵詞的公有函數;小寫字母開頭的就是有private關鍵詞的私有函數。 ui

6. 因爲長度也是數組類型的一部分,所以[3]int與[4]int是不一樣的類型,數組也就不能改變長度。數組之間的賦值是值的賦值,即當把一個數組做爲參數傳入函數的時候,傳入的實際上是該數組的副本,而不是它的指針。 spa

7. 多維數組: 指針

// 聲明瞭一個二維數組,該數組以兩個數組做爲元素,其中每一個數組中又有4個int類型的元素
doubleArray := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}}

// 上面的聲明能夠簡化,直接忽略內部的類型
easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
8. slice並非真正意義上的動態數組,而是一個引用類型。slice老是指向一個底層array,slice的聲明也能夠像array同樣,只是不須要長度。slice是引用類型,因此當引用改變其中元素的值時,其它的全部引用都會改變該值。

從概念上面來講slice像一個結構體,這個結構體包含了三個元素: code

  • 一個指針,指向數組中slice指定的開始位置
  • 長度,即slice的長度
  • 最大長度,也就是slice開始位置到數組的最後位置的長度 內存

9. append函數會改變slice所引用的數組的內容,從而影響到引用同一數組的其它slice。 但當slice中沒有剩餘空間(即(cap-len) == 0)時,此時將動態分配新的數組空間。返回的slice數組指針將指向這個空間,而原數組的內容將保持不變;其它引用此數組的slice則不受影響。 編譯器

10. map和其餘基本型別不一樣,它不是thread-safe,在多個go-routine存取時,必須使用mutex lock機制。

11. make用於內建類型(map、slice和channel)的內存分配。new用於各類類型的內存分配。內建函數new本質上說跟其它語言中的同名函數功能同樣:new(T)分配了零值填充的T類型的內存空間,而且返回其地址,即一個*T類型的值。用Go的術語說,它返回了一個指針,指向新分配的類型T的零值。

      內建函數make(T, args)與new(T)有着不一樣的功能,make只能建立slice、map和channel,而且返回一個有初始值(非零)的T類型,而不是*T。本質來說,致使這三個類型有所不一樣的緣由是指向數據結構的引用在使用前必須被初始化。對於slice、map和channel來講,make初始化了內部的數據結構,填充適當的值。

2.3 流程和函數

1. Go裏面switch默認至關於每一個case最後帶有break,匹配成功後不會自動向下執行其餘case,而是跳出整個switch, 可是可使用fallthrough強制執行後面的case代碼。

2. Go函數支持變參。接受變參的函數是有着不定數量的參數的。爲了作到這點,首先須要定義函數使其接受變參:

func myfunc(arg ...int) {}

3. 變量在內存中是存放於必定地址上的,修改變量實際是修改變量地址處的內存。只有add1函數知道x變量所在的地址,才能修改x變量的值。因此咱們須要將x所在地址&x傳入函數,並將函數的參數的類型由int改成*int,即改成指針類型,才能在函數中修改x變量的值。此時參數仍然是按copy傳遞的,只是copy的是一個指針。當你要傳遞大的結構體的時候,用指針是一個明智的選擇。

  • Go語言中string,slice,map這三種類型的實現機制相似指針,因此能夠直接傳遞,而不用取地址後傳遞指針。(注:若函數需改變slice的長度,則仍須要取地址傳遞指針)

4. 在defer後指定的函數會在函數退出前調用。若是有不少調用defer,那麼defer是採用後進先出模式。

5. 在Go中函數也是一種變量,咱們能夠經過type來定義它,它的類型就是全部擁有相同的參數,相同的返回值的一種類型。

2.4 struct類型

1. 幾種聲明使用struct方式:
  • 1.按照順序提供初始化值

    P := person{"Tom", 25}

  • 2.經過field:value的方式初始化,這樣能夠任意順序

    P := person{age:24, name:"Tom"}

  • 3.固然也能夠經過new函數分配一個指針,此處P的類型爲*person

    P := new(person)

2. Go支持只提供類型,而不寫字段名的方式,也就是匿名字段,也稱爲嵌入字段。
相關文章
相關標籤/搜索