0
点赞
收藏
分享

微信扫一扫

golang基础底层强化

青鸾惊鸿 2022-03-11 阅读 66

底层知识补充

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字节!
将结构体变量地址值,传递(传引用)

结构体指针做函数返回值时 注意:不可以返回局部变量的地址值 ---- 局部变量保存在栈帧上,函数调用结束后,栈帧释放。局部变量的地址,不再受系统保护,随时可能分配给其他程序

举报

相关推荐

0 条评论