一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
集合类型
很多同一类型的元素放在一起的场景就是集合
Go语言的集合类型包括:
- 数组(array)
- 切片(slice)
- 映射(map)
数组(array)
数组存放的是固定长度、相同类型的数据,存放的元素是连续的,数据类型没有限制。
声明数组
array := [5]string{"a","b","c","d","e"}
//不声明长度,自动推导
array := [...]string{"a","b","c","d","e"}
//初始化特定元素必须声明长度
arrayA := [5]string{1:"a",3:"b"}
打印数组
func main() {
array := [5]string{"a","b","c","d","e"}
for i := 0; i < 5; i++ {
fmt.Printf("数组索引:%d,对应值:%s\n\n", i, array[i])
}
}
Go语言有一种新型的循环for range,也可以实现循环,并且更加简便。
func main() {
array := [5]string{"a", "b", "c", "d", "e"}
for i, v := range array {
fmt.Printf("数组索引:%d,对应值:%s\n\n", i, v)
}
}
也可以通过 _ 将数组的索引丢弃。
切片(slice)
array := [5]string{"a", "b", "c", "d", "e"}
slice := array[2:5]
fmt.Println(slice)
基于数组生成切片,包含第一个索引,不包含第二个索引。所以上面例子输出c d e。
切片也有简便的写法,array[:4]相当于array[0:4]、array[1:]相当于array[1:array.length]、array[:]相当于array[0:array.length]
切片修改
array := [5]string{"a", "b", "c", "d", "e"}
slice := array[2:5]
slice[0] = g
fmt.Println(array) // a b g d e
上例说明切片基于数组,修改切片也是在修改数组。
切片声明
- 切片长度:切片中元素的个数
- 切片容量:切片的空间
slice1 := make([]string,4)//元素类型为string的切片长度是4
slice2 := make([]string,4,8)//指定切片的容量为8,注意切片的容量不能比切片的长度小
slice3 := []string{"a","b","c","d"}//字面量方式初始化
Append
//追加元素
slice2 := append(slice,"f","r")
//追加切片
slice2 := append(slice,slice2...)
容量不足的时候会自动扩容
注意:在新建切片的时候,最好使长度和容量相同,这样在追加操作的时候会生成新的底层数组。
切片循环
与for相同
映射(Map)
无序的k-v键值对组合,所有的k类型相同,所有的v类型相同,但是k和v类型不必相同。
声明初始化
nameAgeMap := make(map[string]int)
nameAgrMap["xiaoyu"] = 19
nameAgeMap := map[string]int{"xiaoyu":19}
[ ]里为key的类型,后面的是value的类型
Map的获取和删除
//添加键值对
nameAgeMap["yu"] = 19
//获取指定key对应的value
age := nameAgeMap["yu"]
如果key不存在返回的是该类型的零值
delete(nameAgeMap,"yu")
遍历Map
for range 返回两个值
- key
- value
for k,v := range nameAgeMap{
fmt.Println("key",k,"value",v)
}
Map的大小
fmt.Println(len(nameAgeMap))
String和 []byte
s := "Hello"
b := []byte(s)
fmt.Println(s[0])
字符串可以使用s[0],注意:在UTF8的编码下,一个汉字对应三个字节。