1. 数组
??数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,数组的长度是固定的。
var 数组变量名 [元素数量]Type
var a [3]int
var array_name [size1][size2]...[sizen] array_type
var array [4][2]int
- 数组间的比较
??不同于Java,go中可以直接用“==”进行比较,两个数组相等的条件是数组的长度以及数组中的每一个元素都相等
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c)
var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"
for k, v := range team {
fmt.Println(k, v)
}
2. 切片
??切片简单来讲就是对一段连续内存地址片段的引用。go语言支持切片作为一种数据类型,可以定义一段切片或者从数组、切片中截取一段切片。
var name []Type
var arr []int
??(2)make关键字
make([]Type, size, cap)
make([]int, 5, 10)
??其中Type是指切片的元素类型,size是指为这个类型分配多少个元素,cap是预分配的空间,合理设置cap,可以降低多次分配空间造成的性能问题。
??(2) 从现有数组或者切片中截取
slice [开始位置 : 结束位置]
a := [3]int{1, 2, 3}
fmt.Println(a, a[1:2])
??(1)添加元素
var a []int
a = append(a, 1)
a = append(a, 1, 2, 3)
a = append(a, []int{1,2,3}...)
a = append([]int{-3,-2,-1}, a...)
??(2)切片拷贝
copy( destSlice, srcSlice []T) int
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1)
copy(slice1, slice2)
??(3)删除元素
a = []int{1, 2, 3}
a = a[N:]
a = a[:len(a)-N]
a = append(a[:i], a[i+N:]...)
var sliceName [][]...[]sliceType
var slice [][]int
slice = [][]int{{10}, {100, 200}}
3. Map
??Go语言中 map 是一种特殊的数据结构,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。
??(1)声明map类型
var mapname map[keytype]valuetype
??(2)分配内存
var mapLit map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapLit = make(map[string]int, 5)
var mapLit map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapLit["key"] = 1
v, ok := mapLit["key"]
delete(mapLit, "key")
scene := make(map[string]int)
scene["route"] = 66
scene["brazil"] = 4
scene["china"] = 960
for k, v := range scene {
fmt.Println(k, v)
}
4. List
??List数据结构的内部实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。
变量名 := list.New()
var 变量名 list.List
package main
import "container/list"
func main() {
l := list.New()
l.PushBack("canon")
l.PushFront(67)
element := l.PushBack("fist")
l.InsertAfter("high", element)
l.InsertBefore("noon", element)
l.Remove(element)
}
l := list.New()
l.PushBack("canon")
l.PushFront(67)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
5. Ring
??Ring 类型实现的是一个循环链表,也就是我们俗称的环,这个链表是首尾相连的。它和链表List最大的区别在于 Ring在初始化的时候需要指定长度,而且长度一旦确定之后就不能进行修改了。
ring := ring.New(3)
func main() {
ring := ring.New(3)
for i := 1; i <= 3; i++ {
ring.Value = i
ring = ring.Next()
}
s := 0
ring.Do(func(p interface{}){
s += p.(int)
})
fmt.Println("sum is", s)
}
func New(n int) *Ring
func (r *Ring) Do(f func(interface{}))
func (r *Ring) Len() int
func (r *Ring) Link(s *Ring) *Ring
func (r *Ring) Move(n int) *Ring
func (r *Ring) Next() *Ring
func (r *Ring) Prev() *Ring
func (r *Ring) Unlink(n int) *Ring
|