底层知识补充
1.栈帧 :用来给函数运行提供内存空间,取内存于stack上,当函数调用时,产生栈帧,函数结束时,释放栈帧
栈帧存储(一个函数对应一块栈帧):①局部变量。②形参。③内存字段描述值
如果有函数调用,则被调用的函数产生的栈帧连续存放
2.指针使用注意:
空指针:未被初始化的指针,指向nil
野指针:被一片无效的地址空间初始化
3.在heap上申请一片内存地址空间
p1 = new(int)
p2=new(string)
fmt.Printf("%q",*p2) //打印go语言格式的字符串
fmt.Printf(“p2 = %p\n”,p2) // 地址形式输出
%T //输出类型名
4.变量存储 :
等号左边的变量为指向内存所在的空间 写
等号右边的变量代表的是指向内存所在空间的值 读
5.申请的栈的空间是会随着函数调用结束后释放,但是堆空间不会(new产生的)
6.传递值与传引用(指针)要分开
7.切片:不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案
为什么用切片?
1.数组容量固定,不能自控扩展
2.数组是值传递
在GO语言中,我们几乎可以在所有的场景中使用切片替换数组使用
切片的本质 :不是一个数组的指针,是一种数据结构体,用来操作数组内部元素
切片的使用:
比如有一个数组或者切片 arr := [10]int{1,2,3,4,5,6,7,8,9,0}
s:= arr[2:5:7] //初始序号为2,结束为4,容量为7的切片
切片名称[low : high : max]
low : 起始下标位置
high : 结束下标位置 len = high-low
容量: cap =max-low
截取数组,初始化切片时,没有制定切片容量时,切片容量跟随原数组(切片)
s[:high:max] :从0开始,到high结束。(不包括)
s[low:] 从low开始,到末尾
s[ : high] 从0开始,到high结束,容量跟随原先容量(常用)
切片的创建 :
1 .自动推到类型创建 slice := []int{1,2,3,5}
2.slice := make([]int, 长度,容量)
3.slice := make([]int,长度) //创建切片时候,没有制定容量,长度==容量
切片做参数 -》 穿地址
append : 在切片末尾增加元素
apped(切片对象,待追加元素)
8.Map 字典、映射 key — value key:唯一,无序,不能是引用类型
map不能使用cap()
Map的创建:
1、make(map[int]string,len) //创建容量为len的一个map,满了后会自动扩充
2、make(map[int]string) //初始len为0
3、var m1 map[int]string
4、m2:= map[int]string{ } //大括号里可以存储数据
map的初始化:
var m1 map[int]string = map[int]string{250:“LuBan”,360:“PIke”}
m2:= map[int]string{250:“LuBan”,360:“PIke”}
map的遍历 :
使用for k,v :=range m1{
fmt.Printf(“key:%d—value : %d\n”,k,v)
}
判断key是否存在
指令m1[250] 会返回两个值 ,第一个是value,第二个是bool 代表该key是否存在
删除map:
delete(map,key)函数: 参数1:待删除元素的map,参数2: key值
map做函数参数和返回值,都是传引用
9.结构体
type Person struct{ —结构体是类型定义,不能在里面进行成员变量赋值
name string
sex byte
age int
}
普通变量定义和初始化:
1.顺序初始化:依次将结构体内部所有成员初始化
var man Person = Person{"andy",'m',20}
2.指定成员初始化:
man := Person{name:"rose",age:18}
结构体变量的比较和赋值:
1.比较:只能用==和!= ,不可以用<>
2.相同结构体类型(结构体内类型、个数都相同)之间是可以直接赋值的
结构体地址 :结构体变量的地址 == 结构体首个变量的地址
结构体的传参:
unSafe.Sizeof(变量名)----> 此种类型的变量所占用的内存空间大小
将结构体变量拷贝一份,传递。--------几乎不用,内存消耗极大,效率低
指针变量定义和初始化:
1 顺序初始化 :依次将结构体内部所有成员初始化
var man *Person=&Person{“andy”,‘m’,20}
2 new(Person)
指针索引成员变量直接使用 ‘.’ 索引成员变量
结构体指针传参:
unSafe.Sizeof(指针) :不管何种类型的指针,在64位操作系统下,大小一致,均为8字节!
将结构体变量地址值,传递(传引用)
结构体指针做函数返回值时 注意:不可以返回局部变量的地址值 ---- 局部变量保存在栈帧上,函数调用结束后,栈帧释放。局部变量的地址,不再受系统保护,随时可能分配给其他程序