续前
数组
声明及初始化
数组定义格式为:var 变量名 [数组长度]变量类型
var arr [5]int //声明arr为长度为5的整型数组
var arr1 [5]int = [5]int{1,2,3,4,5} //初始化arr1为长度为5的整型数组
var arr2 = [5]int{1,2,3,4,5} //同上
var arr2 = [...]int{1,2,3,4,5} //同上
var str = [5]string{2:"xiaoming",4:"grow"} //使用索引号初始化字符串数组的元素
//以上方法也均可以使用:=运算符实现局部初始化
les:=[...]struct{ //在代码块中声明并初始化匿名结构体数组
name string
age int
}{
{"name1",18},
{"name2",24},
}
遍历数组
数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
for i := 0; i < len(a); i++ {
}
for index, v := range a {
}
切片
切片(slice)是数组的一个引用。因此切片是引用类型,本质是一个结构体,做赋值操作时进行浅拷贝。
type slice struct{
array unsafe.Pointer //数组的指针
len int //数组长度
cap int //切片容量
}
创建切片
切片定义格式为:var 变量名 []变量类型
var s1 []int //普通声明
s2:=[]int{} //局部声明
var s3 []int=make([]int,3,5) //使用make()函数声明
操作切片
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[start:end]
var slice1 []int = arr[:end]
var slice2 []int = arr[start:]
var slice3 []int = arr[:]
var slice4 = arr[:len(arr)-1] //去掉切片的最后一个元素
slice5 := arr[start:end]
slice6 := arr[:end]
slice7 := arr[start:]
slice8 := arr[:]
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素
slice10:= append(slice0,10) //使用内置append()函数操作切片
追加切片时如果切片数量超出cap的值,则会扩容。首先复制一份数组元素到其它地址,并提供2倍的cap空间,此时array指针和之前不同,cap为之前的二倍,之后再进行切片操作。
映射
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。map的定义格式为:map[KeyType]ValueType
map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
map操作
scoreMap := make(map[string]int, 8) //使用make()函数初始化
scoreMap["小明"]=90 //通过键值赋值
if val,exists:=scoreMap[“小明”];exists{ //索引的第一个返回值为映射值,第二个返回值为是否存在
fmt.Print(val)
}else{
fmt.Print("小明不存在"]
}
delete(scoreMap,"小明"] //使用delete()函数删除键值对
for k,v := range scoreMap{ //使用range遍历map,返回值为键和值
fmt.Println(k, v)
}