讀書筆記之《Go程式設計語言》---第四章 複合資料型別
阿新 • • 發佈:2019-01-04
四種複合資料型別:陣列、slice、map和結構體,陣列和結構體長度是固定的,slice和map都是動態的
陣列
陣列是具有固定長度且擁有零個或者多個相同資料型別元素的序列
宣告 var q [3]int = [3]{1, 2, 3} 或 q := […]int{1,2,3}
知識點:
- 陣列的長度是陣列型別的一部分,所以[3]int和[4]int是兩種不同的陣列型別
- 如果一個數組的元素型別是可比較的,那麼這個陣列也是可比較的
- Go把陣列和其他型別都看成是指傳遞,若想用引用傳遞,需要顯示地傳遞一個數組指標
slice
slice表示一個擁有相同型別元素的可變常度的序列,通常寫成[]T
宣告 var q []int
知識點:
- slice可以用來訪問陣列的部分或全部元素,而這個陣列是slice的底層陣列
- slice有三個屬性:指標、長度和容量
- 指標指向第一個可以從slice中訪問的元素,這個元素不一定是陣列的第一個元素
- 長度是指slice中的元素的個數,不能超過容量
- 容量是指從slice的起始元素到底層陣列的最後一個元素間元素的個數
- 一個底層陣列可以有多個slice
- slice操作符s[i:j]建立一個新的slice
- 如果slice引用超過了被引用物件的容量,會報錯
- slice包含了底層陣列的指標,所以在傳參時,函式內可以修改底層陣列的元素
- slice不能進行比較
- slice的零值是nil,沒有底層陣列
- make可以建立一個具有指定元素型別、長度和容量的slice,該方法會建立一個無名陣列
- appendInt,每次呼叫都會檢查slice是否有足夠的容量,如果容量不足,則建立一個新的足夠容量的底層陣列,每次擴充套件一倍的容量。
- 只要有可能改變slice的長度或者容量,或者指向新底層陣列時,需要更新slice變數
map
map是一個擁有鍵值對的無序集合,
宣告:ages := make(map[string]int) 或 var ages map[string]int
知識點:
- map中所有的鍵型別必須相同,所有的值型別必須相同,但鍵和值得型別可以不相同
- 鍵的型別k必須是可以通過操作符==號來比較的資料型別
- 使用map的鍵查詢的元素不存在時,返回值型別的零值
- map元素不是一個變數,不可以獲得它的地址
- map中元素迭代順序是不固定的
- 若需要順序訪問map,則需要顯示的給鍵排序,然後按排序順序通過鍵訪問值
- 不能給零值map設定元素,map設定元素前必須初始化
- map中的元素輸出兩個值,第二個值是一個布林值,用來報告元素是否存在,需要和零值區分
- map值型別本身可以是複合資料型別
結構體
結構體是零個或多個任意型別的命名變數組合在一起的聚合資料型別,每個變數都是結構體的成員
定義結構體:先宣告,後定義
知識點:
- 結構體成員通過點號訪問
- 成員變臉的順序對於結構體同一性很重要,有相同變數不同變數順序結構體不是同一個結構體
- 結構體成員變數名稱首字母大寫為可匯出,小寫為不可匯出
- 結構體型別s不可以包含相同型別s的成員變數,但可以包含一個s的指標型別
- 結構體的零值由成員的零值構成
- 沒有成員的結構體為空結構體
- 結構體字面量設定結構體,type Point struct{X , Y int}
- Go是按值呼叫的語言,呼叫函式接收到的是實參的一個副本,不是引用
- 結構體巢狀機制
- go允許定義不帶名稱的結構體成員,稱為匿名成員
- 結構體巢狀機制可以直接訪問內嵌結構體成員
JSON
json中的資料型別的格式
知識點:
- 把go的資料結構轉換為JSON稱為marshal,無編排輸出
- MarshalIndent有編排輸出
- 只有可匯出的成員可以轉換成JSON欄位
- json定義成員標籤:
- unmarshal將JSON轉換成go資料結構
- 即使對應的JSON欄位的名稱不是首字母大寫,結構體成員名稱也必須首字母大寫
- json.Decoder流式解碼器,可以利用它依次從位元組流裡面解碼多個JSON實體
- json.Encode流式編碼器
文字和HTML模板
模板是一個字串或者檔案,它包含一個或者多個兩邊用雙大括號包圍的單元{{…}}(稱為操作)
- 每個操作在模板裡對應一個表示式
- 在操作裡面,有一個表示當前值得標記,用點號(.)表示{{ .Count }}表示Count的值,直接輸出
- 在操作中符號 | 會將前一個操作的結果作為下一個操作的輸入,類似shell中的管道