標籤:io ar os 使用 sp 資料 on div bs
2.2 Go基礎
1. :=這個符號直接取代了var和type,這種形式叫做簡短聲明。不過它有一個限制,那就是它只能用在函數內部;在函數外部使用則會無法編譯通過,所以一般用var方式來定義全域變數。
2. rune是int32的別稱,byte是uint8的別稱。不同類型的變數之間不允許互相賦值或操作,不然會在編譯時間引起編譯器報錯。
3. 儘管int的長度是32 bit, 但int 與 int32並不可以互用。浮點數的類型有float32和float64兩種(沒有float類型),預設是float64。
4. 大寫字母開頭的變數是可匯出的,也就是其它包可以讀取的,是公用變數;小寫字母開頭的就是不可匯出的,是私人變數。
5. 大寫字母開頭的函數也是一樣,相當於class中的帶public關鍵詞的公有函數;小寫字母開頭的就是有private關鍵詞的私人函數。
6. 由於長度也是數群組類型的一部分,因此[3]int與[4]int是不同的類型,數組也就不能改變長度。數組之間的賦值是值的賦值,即當把一個數組作為參數傳入函數的時候,傳入的其實是該數組的副本,而不是它的指標。
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像一個結構體,這個結構體包含了三個元素:
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) {}
build-web-application-with-golang筆記