Go学习笔记(二)
集合数据
-
数组
-
切片
-
映射
数组array
- 同类元素的集合,连续地址
- 定义包括元素类型、数组长度
- 声明后类型、长度均不可变
- 类型相同、长度不同不能相互复制
// 只声明未赋值
// 初始化数据为0
var arr1 [5]int
// 声明并直接赋值
arr2:=[3]int{11,12,13}
// 可以不填写长度但是长度依然是定长
arr3 := [...]int{1,3,5,7,9,11}
// 特殊位置初始化 [0]=99, [3]=100
arr4 := [4]int{0:99,3:100}
fmt.Printf("%v %v",arr1,arr2)
// 打印出来带中括号
数组复制
数组变量之间复制的时候会拷贝整个数组(值拷贝)
数组传参数
- 实参拷贝一份给形参,之后二者相互独立
- 传递大数组作为参数的时候,尽量使用指针
func changeLocal(num [5]int){
fmt.Printf("%v",num);
}
func main(){
num := [...]int{5,6,7,8};
changeLocal(num);
}
数组遍历
a := [...]float64{67.7,89.9,345.5}
for i,v := range a{
}
多维数组
a := [3][2]string{
{"",""},
{"",""},
{"",""}, //最后一个对象也有逗号
}
切片slice
- 就是封装了底层数组的一个可变数组工具
- 引用类型,不支持==运算
- 切片三个变量
- 底层数组指针
- 切片当前长度
- 切片容量(小于等于底层数组容量,超过时要变更底层的数组)
切片的声明
var indentifier []dataType
//声明后,切片为空,数组指针也为空
i := make([]int,5,5)
// 为什么不用构造函数构造?
// 因为:像这样的比较底层的数组声明,更关注类型,用一些底层的内置函数,可复用性更强
new 和 make的区别
- 两个都是内建函数,主要用来在堆上进行分配类型的内存
- new用于普通类型的内存分配,内存清零
创建切片
- 创建指定底层数组
ā := [5]int{}
s1 := a[0:4] //这个是前闭后开,具体长度为0到3元素
- 同时创建数组和切片
c := [3]int{6,7,8}
// 也可以不确定大小
a := []int{7,8,9}
b := [...]int{1,2,3,4}
切片长度和容量
-
内置函数len() 返回切片的当前长度
-
内置函数cap() 返回切片底层数组容量
arr := [7]int{}
sli := arr[1:3]
// sli的长度为2,容量为6
映射map
personSalary := map[string]int{ "steve":12000, "jamie":15000,}personSalary["mike"] = 9000
多维映射
string.FieldsFunc