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

相关文章
相关标签/搜索