Go语言学习笔记(二)Go语言容器(array、slice、map、list)

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)
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值