golang随记 | 实习笔记
1.defer的注意事项和细节
- 当go执行到一个defer时,不会立即执行defer后的语句,而是将defer后的语句压入到一个独立栈中【暂时称该栈为defer栈】,然后继续执行函数下一个语句。
- 当函数执行完毕后,再从defer栈中,依次从栈顶取出语句执行(注:遵守栈 先入后出的机制出栈,然后执行),所以前面看到案例的输出顺序。
- 在defer 将语句放入到栈时,也会将相关的值拷贝同时入栈。
例子:
1 |
|
输出结果:
1 |
|
2.GoLang中&与*的区别以及使用
&
符号的意思是对变量取地址*
符号的意思是对指针取值
例子
1 |
|
GO的结构体和数组以及string均是值类型 ,切片是引用类型
值类型和引用类型
值类型:int、float、bool、string、数组array、结构体struct
引用类型:指针、切片slice、map、接口interface、函数func、管道chan
区别
值类型:
变量直接存储值,内存通常在栈中分配。
给新的变量赋值时(拷贝时),为深拷贝,直接开辟新的内存地址存储值。
引用类型:
变量直接存储内存地址,这个地址存储值。内存通常在堆上分配。
给新的变量赋值时(拷贝时),为浅拷贝,新的变量通过指针指向原来的内存地址。可以使用copy关键字实现引用类型的深拷贝。
当如果没有任何一个变量引用这个地址时,这个地址就会被GC垃圾回收。
Go语言中函数的参数永远是拷贝的
1 |
|
Go结构体嵌套可以模拟实现继承
Go for循环里面使用协程需要复制一份再进行操作,否则会出现读取数据异常
1 |
|
golang随记 | 实习笔记
https://zty-f.github.io/2022/06/22/golang随记/