《Go语言实战》笔记——第4章 数组、切片和映射
《Go语言实战》笔记——第4章 数组、切片和映射
1 数组
1. 1一维数组的创建
//声明一个数组,数组类元素已初始化为零值
var array_1[5]int
//使用数组字面量声明数组
array_2:=[5]int{1,2,3,4,5}
//自动计算数据长度
array_3:=[...]int{1,3,5,7,9}
//初始化时,指定特定元素的值
array_4:=[5]int{1:10,4:9}
//???在为指针数组赋值之前必须要先声明指针类型
array_5:=[5]*int{1:new(int)}
*array_5[1]=20
var array_7_1[3]*string
array_7_2:=[3]*string{new(string),new(string),new(string)}
*array_7_2[0]="Red"
*array_7_2[1]="Blue"
*array_7_2[2]="Green"
array_7_1=array_7_2
1.2. 多维数组的创建
//声明1
var array_8[4][2]int
//声明2,赋值
array_9:=[4][2]int{{1,2},{3,4},{5,6},{7,8}}
//声明2,指定外层索引赋值(指定某一行)
array_10:=[4][2]int{1:{3,4},3:{5,6}}
//声明2,指定单个元素
array_11:=[4][2]int{1:{1:4},3:{0:5}}
2 切片
2.1 切片的创建
//使用长度声明一个切片
slice_1:=make([]string,5)
//使用长度与容量声明一个切片
slice_2:=make([]string,3,5)
//使用切片字面量声明切片
slice_3:=[]string{"Red","Blue","Green","Yellow","Pink"}
slice_4:=[]int{1,2,3,4}
//使用索引声明切片,初始化100个元素
slice_5:=[]string{99:"I'm100"}
//声明nil切片,长度0,容量0
var slice_6[]int
//声明空切片,长度0,容量0
slice_7:=make([]int,0)
slice_8:=[]int{}
2.2 切片增长
//向切片中增加元素,长度<容量,会产生覆盖
slice_9:=[]int{1,2,3,4,5}
slice_10:=slice_9[1:3]
fmt.Println(slice_10)
slice_10=append(slice_10,6)
//长度=容量时,扩充容量(容量<1000时,翻倍,此后1.25倍)
slice_11:=[]int{1,2,3,4}
slice_12:=append(slice_11,5)
//在创建切片时,限制容量
slice_13:=[]string{"Apple","Orange","Plum","Banana","Grape"}
slice_14:=slice_13[2:3:4]
//为防止覆盖元数据,设置容量与长度一样
slice_15:=[]string{"Apple","Orange","Plum","Banana","Grape"}
slice_16:=slice_15[2:3:3]
slice_16=append(slice_16,"Kiwi")
//此时,元数据slice_15没有被覆盖
//将切片追加到切片
slice_17:=[]int{1,2}
slice_18:=[]int{3,4}
fmt.Printf("%v\n",append(slice_17,slice_18...))
2.3 多维切片
//多维切片
slice_19:=[][]int{{10},{100,90}}
fmt.Println(slice_19)
//追加
slice_19[0]=append(slice_19[0],20)
fmt.Println(slice_19)
3 映射
3.1 创建映射
//创建映射,键:string值:int
dict_1:=make(map[string]int)
fmt.Println(dict_1)
//创建映射,使用映射字面量
dict_2:=map[string]string{"Red":"#da1337","Orange":"#e95a22"}
fmt.Println(dict_2)
//创建空映射
dict_3:=map[int]string{}
fmt.Println(dict_3)
//创建未初始化的映射nil
var dict_4 map[string]string
fmt.Println(dict_4)
3.2 使用切片作为映射的值
//使用切片作为映射的值,但是不可作为键
dict_5:=map[int][]string{}
dict_5[0]=[]string{"liu","hao","yu"}
fmt.Println(dict_5)
3.3. 取值操作
//取值返回健值与这个键是否存在的标志
dict_6:=map[string]string{"Red":"#da1337","Orange":"#e95a22"}
value,exists:=dict_6["Red"]
if exists{
fmt.Println(value)
}
//若取值键不存在,返回的值是该值对应类型的零值,
//也可以依据这个进行判断(在存储的值不是零值的情况下)
value,exists=dict_6["Blue"]
if value !="" {
fmt.Println(value)
}
3.4 迭代映射
//迭代映射
dict_7:=map[string]string{
"AliceBlue":"#f0f8ff",
"Coral":"#ff7f50",
"DarkGray":"#a9a9a9",
"ForestGreen":"#228b22",
}
for key_7,value_7:= range dict_7{
fmt.Printf("Key:%s \t Value:%s\n",key_7,value_7)
}
3.5. 删除键值对
//删除键值对
dict_8 := map[string]string{
"AliceBlue":"#f0f8ff",
"Coral":"#ff7f50",
"DarkGray":"#a9a9a9",
"ForestGreen":"#228b22",
}
delete(dict_8,"Coral")
for key_8,value_8 := range dict_8{
fmt.Printf("Key:%s\tValue:%s\n",key_8,value_8)
}