Go學習筆記(三)

(文章持續更新中...有志同道合的人能夠一塊兒探討下。整個系列(1~8)準備重寫,不過都是很基礎的入門筆記,想學到很深刻的東西則不建議閱讀...)算法

複雜類型的變量稱爲容器

數組(Array)是一段固定長度的連續內存區域數組

數組申明 : var 數組變量名 [元素數量]T

var team [3]string
team[0] = "winyh"
team[1] = "snowman"
fmt.Println(team)

// 數組初始化
var team = [3]string{"winyh", "snowman", "age"}

// ...表示讓編譯器肯定數組大小。編譯器會自動爲設置元素個數爲 3
var team = [...]stringstring{"winyh", "snowman", "age"}

// 數組遍歷
var team [3]string{"winyh", "snowman", "age"}

for k, v := range team {
    fmt.Println(k, v)
}

複製代碼

切片是一個擁有相同類型元素的可變長度的序列。通常用於快速地操做一塊數據集合bash

從連續內存區域生成切片是常見的操做

slice 表示目標切片對象。
slice [開始位置:結束位置]
切片和數組密不可分

var a  = [3]int{1, 2, 3}
fmt.Println(a, a[1:2])

// 聲明字符串切片
var strList []string
// 聲明整型切片
var numList []int
// 聲明一個空切片
var numListEmpty = []int{}

// 輸出3個切片大小
fmt.Println(len(strList), len(numList), len(numListEmpty))
// 切片斷定空的結果
fmt.Println(strList == nil)
fmt.Println(numList == nil)
複製代碼

使用 make() 函數構造切片併發

make( []T, size, cap )
T表示的元素類型
size表示爲這個類型分配多少個元素
cap表示預分配的元素數量,不影響size,只是能提早分配空間,加強編譯性能

內建函數 append() 能夠爲切片動態添加元素
numbers := []int
numbers = append(numbers, i)

var car []string
       
// 添加1個元素       
car = append(car, "OldDriver")
       
// 添加多個元素
car = append(car, "Ice", "Sniper", "Monk")
// 添加切片
team := []string{"Pig", "Flyingcake", "Chicken"}
car = append(car, team...)

// 切片複製
內建的 copy() 函數,能夠迅速地將一個切片的數據複製到另一個切片空間中
copy( destSlice, srcSlice []T) int
srcSlice 爲數據來源切片
destSlice 爲複製的目標。目標切片必須分配過空間且足夠承載複製的元素個數。來源和目標的類型一致,copy 的返回值表示實際發生複製的元素個數

// 複製原始數據從4到6(不包含)
copy(copyData, srcData[4:6])

Go 語言中切片刪除元素的本質是:以被刪除元素爲分界點,將先後兩個部分的內存從新鏈接起來。
seq := []string{"a", "b", "c", "d", "e"}
// 指定刪除位置       
index := 2
// 查看刪除位置以前的元素和以後的元素
fmt.Println(seq[:index], seq[index+1:])
// 將刪除點先後的元素鏈接起來
seq = append(seq[:index], seq[index+1:]...)
fmt.Println(seq)
複製代碼

Go語言map(Go語言映射)

在業務和算法中須要使用任意類型的關聯關係時,就須要使用到映射,如學號和學生的對應、名字與檔案的對應等app

Go 語言中 map 的定義async

map[KeyType]ValueType
KeyType爲鍵類型
ValueType是鍵對應的值類型
複製代碼

map在申明時能夠填充內容函數

m := map[string]string{
    "W": "forward",
    "A": "left",
    "D": "right",
    "S": "backward",
}
複製代碼

map 的遍歷過程使用 for range 循環完成性能

scene := make(map[string]int)
scene["route"] = 66
scene["brazil"] = 4
scene["china"] = 960
for k, v := range scene {
    fmt.Println(k, v)
}

使用 delete() 內建函數從 map 中刪除一組鍵值對

delete(map, 鍵) // map 是要刪除的map實例

scene := make(map[string]int)
// 準備map數據
scene["route"] = 66
scene["brazil"] = 4
scene["china"] = 960
delete(scene, "brazil")
複製代碼

併發讀寫map時用async.mapui

package main
import (
      "fmt"
      "sync"
)
func main() {
    var scene sync.Map
    
    // 將鍵值對保存到sync.Map
    scene.Store("greece", 97)
    
    // 從sync.Map中根據鍵取值
    fmt.Println(scene.Load("greece"))
    
    // 根據鍵刪除對應的鍵值對
    scene.Delete("greece")
    
    // 遍歷全部sync.Map中的鍵值對
    scene.Range(func(k, v interface{}) bool {
        fmt.Println("iterate:", k, v)
        return true
    })
}
複製代碼

列表是一種非連續存儲的容器,由多個節點組成,節點經過一些變量記錄彼此之間的關係。列表有多種實現方法,如單鏈表、雙鏈表等spa

有兩種初始化列表的方法

經過 container/list 包的 New 方法初始化 list
變量名 := list.New()

var 變量名 list.List

雙鏈表支持從隊列前方或後方插入元素,分別對應的方法是 PushFront 和 PushBack.刪除用Remove方法

遍歷雙鏈表須要配合 Front() 函數獲取頭元素,遍歷時只要元素不爲空就能夠繼續進行。每一次遍歷調用元素的 Next

l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
for i := l.Front(); i != nil; i = i.Next() {
    fmt.Println(i.Value)
}
複製代碼
相關文章
相關標籤/搜索