golang 經常使用數據結構git
基本用法github
// 定義結構體 type Person struct { Name string Age int } // 結構體值接收者方法 func (p Person) getName() string { return p.Name } // 結構體指針接收者方法 func (p *Person) setName(name string) string { p.Name = name } // 聲明結構體 var person Person var person *Person person := Person{Name: 'leon'} person := &Person{Name: 'leon'}
結構體還能夠嵌套,只聲明類型,而不指定名字,則默認包涵該類型全部字段。也能夠指定名字。golang
type Human struct { Person } var h Human h.Name // 能夠直接調用 h.getName() type Human struct { male Person } var h Human h.male.Name // 須要經過名字調用 h.male.getName()
數組的長度不可改變,聲明時須要指定數組長度和類型。json
var arr [20]int arr := [2]int{1,2} arr := [...]int{1,3} // 根據寫入的個數自動計算長度 arr[1] = 1 // 轉換爲 slice sarr := arr[0:2]
slice 是能夠動態增加的數組。聲明時能夠指定長度(len)和容量(cap)。當 cap 通常是 *2 增加。數組
slice 能夠用內建函數 make 來建立,具體可填參數:make(Type, len, cap)。數據結構
var arr []int // arr == nil arr := []int{1,2} arr := make([]int, 10) // 指定 len=10,默認 cap=10 arr := make([]int, 10, 20) // 指定 len=10,cap=20 arr = arr[2:4] // 取子slice,取 2,3 arr = arr[:3] // 取 0,1,2 arr = arr[3:] // 取 3及後面全部元素 3,.... arr = arr[:0] // 複用 slice, len, cap = 0 arr = append(arr, 1) // 經過 append 給 slice 追加元素 for index, value := range arr { fmt.Printf("2**%d = %d\n", index, value) }
說一下兩種聲明的區別:app
var arr []int // 聲明瞭類型,但並無初始化零值,在 json 編碼時是 null arr := []int // 聲明瞭類型並初始化,在 json 編碼時是 []
從數據結構上來看,slice 本質是一個struct,包含三部分:頭指針、長度、容量。任何對 slice 長度的改變,都會返回一個新 slice(由於內容的長度發生了變化)。其實頭指針指向一個數組,若是你使用 append 函數來追加元素時,若是數組使用完了,append 函數會自動的建立一個更長的新數組,而後返回一個新的 struct,包含新數組的長度和容量。函數
slice 結構體在源碼 runtime/slice.go
中的定義,array 是指向數組的指針,len、cap 是長度和容量。學習
type slice struct { array unsafe.Pointer len int cap int }
基本使用編碼
var hash map[string]string hash := make(map[string]string) // 賦值 hash["a"] = "a" // 刪除 delete(hash, "a") // 賦值並返回一個是否存在標識,ok 是一個 bool v, ok := hash["a"]