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"]