golang复合类型总结
指针类型,数组,切片,map和结构体
指针:
指针就是地址
var p *int
a=1
p = &a
*p = 999 相当于a=999
指针必须有一个合法的指向才能调用赋值等 new关键字和make关键字留意一下。new之后不需要释放,自动的gc
值传递和指针传递的区别---值传递是拷贝一份,指针则是指向其内存
数组:(同一个类型的集合)
必须指定长度,并且长度是常量,索引下标为0,循环赋值 rand关键字(取6位的随机数),冒泡排序
数组做参数是值传递,指针类型的数组才是引用传递
优点:
1、按照索引查询元素速度快
2、能存储大量数据
3、按照索引遍历数组方便
缺点:
1、根据内容查找元素速度慢
2、数组的大小一经确定不能改变。
3、数组只能存储一种类型的数据
4、增加、删除元素效率慢
5、未封装任何方法,所有操作都需要用户自己定义。
6、数组的空间必须是连续的,这就造成数组在内存中分配空间时必须找到一块连续的内存空间。
数组缺点:大小固定,做完函数参数会全部拷贝一份
引入切片:
切片:弥补数组缺点—可以认为是一个动态数组(变长)
切片不指定数组前面那个长度 比如 a:=[]int{1,2}.数组指定长度,切片不指定。切片可以自动扩容,2倍的速度扩容
切片可以指定输出
my_array := []int{1,2,3,4,5}
slice := my_array[0:3:5] //[low:hight:max] len=high - low cap = max-low 取0-3,最多取5个
这里的结果为:slice为1,2,3,len长度为3,cap为5 留意append关键字
切片得截取
slice := my_array[6:]
slice := my_array[:3]
slice := my_array[:]
slice := my_array[6]
普通切片不会改变底层数组,指针切片则会改变
同样的切片的值传递和指针的地址传递 留意copy关键字
map
Info:=map[键类型]值类型{1:“aa”}
键是唯一的,函数,切片等不能做键值。容量自动扩充,打印顺序无序
Map做参数是引用传递的
结构体
有type和struct关键字,没有前面的变量的var关键字
将不同类型的数据组合成一个有机的整体
可以顺序初始化也可以指定初始化,顺序初始化需要全部赋值
指定初始化栗子:p2 := Student{name:"aa",addr:"北京"}
可见性需要留意一个首字母大写的问题