1.数组
数组(array)是一段固定长度的连续内存区域。在go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。
a).数组的声明
var 数组名 [元素数量]T
注:元素数量必须是整型数值且在编译期就确定
T可以是任意基本类型,包括T为数组本身,此时可以实现多维数组
b).数组的初始化
方式1:
var str [3]string
str[0] = "hello"
str[1] = "world"
方式2:
var str = [3]string{"hello", "world", ""}
方式3:
var str = [...]string{"hello", "world", ""}
c).二维数组
var arr [3][4]int //定义三行四列的整型数组
d).数组遍历
使用for-range遍历数组
for k, v := range str {
fmt.Println(k, v)
}
2.切片
切片(slice)是一个拥有相同类型元素的可变长度的序列。Go语言切片的内部结构包含地址、大小和容量。切片一般用于快速地操作一块数据集合。
a).切片的生成
方式一:从数组生成切片
var a = [...]int{1, 2, 3}
var slice []int = a[1:2] //从数组a生成切片slice
方式二:从切片生成切片
var a = [...]int{1, 2, 3}
var slice []int = a[0:]
var ss []int = slice[1:2]
方式三:直接声明新的切片
var slice []int
方式四:使用make()函数构造切片
make([]T, size, cap)
构造一个元素个数为size,容量为cap,类型为T的切片
a := make([]int, 2, 3)
注:
●取出元素不包含结束为止对应的索引,切片最后一个元素使用slice[len(slice)]获取
●当缺省开始位置时,表示从连续区域开头到结束位置
●当缺省结束为止时,表示从开始位置到整个连续区域末尾
●两者同时缺省时,与切片本身等效
●两者同时为0时,等效于空切片,一般用于切片复位
b).append()为切片添加元素
Go语言的内建函数append()可以为切片动态添加元素。每个切片会指向一片内存空间,这片内存空间能容纳一定数量的元素。当空间不能容纳足够多的元素时,切片就会进行扩容。“扩容”操作往往发生在append()函数调用时。
经过测试发现,切片在扩容时,容量的扩展规律按容量的2倍进行,例如1、2、4、8、16.....
var slice[] int
slice = append(slice, 3) //使用append()一次添加一个元素
slice = append(slice, 1, 2, 3) //使用append()一次添加多个元素
team := []string{"pig", "chicken"}
slice = append(slice, team...) //team后面加上...,表示将team整个添加到slice后面
切片看起来等价于C++中的vector。
c).copy()切片复制
copy()函数原型:func copy(destSlice, srcSlice []T) int
destSlice为复制的目标。目标切片必须分配过空间(通过make来分配空间,make([]T, len, cap))且足够承载复制的元素个数。
d).从切片中删除元素
go没有提供直接对切片删除元素的接口,只能通过append实现,举例如下:
//删除二号元素
seq := []string{"a", "b", "c", "d", "e"}
index := 2
seq = append(seq[:index], seq[index + 1:]...)
3.map
a).map的定义
map[KeyType]ValueType
KeyType :键类型
VauleType:值类型
scene := make(map[string]int) //使用make生成一个map
//map声明时填充内容
m := map[string]string{
"W":"forward",
"A":"left",
"D":"right",
"S":"backward",
}
b).向map中添加元素
scene["route"] = 66
c).查询map中是否存在指定key的元素
v, ok := sence["route"]
如果ok为true,说明map中含有key为“route”的元素,反之则无。
d).遍历map
for k, v := range scene {
fmt.Println(k, v)
}
//只遍历值
for _, v :range scene {
......
}
//只遍历键
for k : range scene {
......
}
注意:遍历输出元素顺序与填充顺序无关。不能期望map在遍历时返回某种期望顺序的结果
e).从map中删除元素和清空
delete(map, key) //从map中删除key的元素
map = make(map[string]string) //重新make一个新的map来进行清空
4.list
a).列表初始化
方式一:通过container/list包的New方法初始化list
l := list.New()
方式二:通过声明初始化list
var l list.List
列表没有具体元素类型的限制。因此列表的元素可以是任意类型
b).在列表中插入元素
l := list.New()
l.PushBack("first") //从链表尾部插入元素“first”
element := l.PushFront(67) //从链表头部插入元素67
l.InsertAfter("high", element) //在element后插入元素
l.InsertBefore("noon", element) //在element前插入元素
c).从链表中删除元素
l.Remove(element)
d).遍历列表
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}