golang 數據結構

golang 經常使用數據結構git

  • struct
  • array
  • slice
  • map

struct

基本用法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()

array

數組的長度不可改變,聲明時須要指定數組長度和類型。json

var arr [20]int
arr := [2]int{1,2}
arr := [...]int{1,3} // 根據寫入的個數自動計算長度

arr[1] = 1

// 轉換爲 slice
sarr := arr[0:2]

slice

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 在源碼中具體的數據結構是什麼樣?

從數據結構上來看,slice 本質是一個struct,包含三部分:頭指針、長度、容量。任何對 slice 長度的改變,都會返回一個新 slice(由於內容的長度發生了變化)。其實頭指針指向一個數組,若是你使用 append 函數來追加元素時,若是數組使用完了,append 函數會自動的建立一個更長的新數組,而後返回一個新的 struct,包含新數組的長度和容量。函數

slice 結構體在源碼 runtime/slice.go 中的定義,array 是指向數組的指針,len、cap 是長度和容量。學習

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

map

基本使用編碼

var hash map[string]string
hash := make(map[string]string)

// 賦值
hash["a"] = "a"

// 刪除
delete(hash, "a")

// 賦值並返回一個是否存在標識,ok 是一個 bool
v, ok := hash["a"]

Ref

相關文章
相關標籤/搜索