有趣的知识点
new() 与 make() 的区别
new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)
gc垃圾回收,三色标记
逃逸分析
https://blog.csdn.net/weixin_44065217/article/details/122482368 逃逸分析是编译器用来确定由程序创建的值所处位置的过程。具体来说,编译器执行静态代码分析,以确定是否可以将值放在构造函数的栈(帧)上,或者该值是否必须“逃逸”到堆上。在Go中,没有关键字或函数可以用于在此决策中指导编译器。只有通过你写的代码来分析这一点
- 逃逸分析的好处是为了减少gc的压力,不逃逸的对象分配在栈上,当函数返回时就回收了资源,不需要gc标记清除。
- 逃逸分析完后可以确定哪些变量可以分配在栈上,栈的分配比堆快,性能好
- 同步消除,如果你定义的对象的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的机器码,会去掉同步锁运行。
调度模型、调度器,GMP,netpoller
- https://wudaijun.com/2018/01/go-scheduler/
- https://zhuanlan.zhihu.com/p/108603451
- http://hushi55.github.io/2015/12/08/golang-G-P-M
- https://pandaychen.github.io/2020/02/28/GOMAXPROCS-POT/
chan原理
- https://blog.csdn.net/weixin_42309691/article/details/125694412
- https://www.cnblogs.com/haiyux/p/15161495.html
|
|
init函数要点知识
- init函数先于main函数自动执行,不能被其他函数调用;
- init函数没有输入参数、返回值;
- 每个包可以有多个init函数;
- 包的每个源文件也可以有多个init函数,这点比较特殊;
- 同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
- 不同包的init函数按照包导入的依赖关系决定执行顺序。
值类型和引用类型
- 值类型 : 基本数据类型int、float、bool、string以及数组和struct
- 值类型:变量直接存储,内存通常在栈中分配。
- 引用类型:指针、slice、map、chan等都是引用类型
- 引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收
rune和byte的区别
调度器
map的底层实现
- 参考Go语言map底层实现
- 大话图解golang map源码详解
- https://github.com/qcrao/Go-Questions/tree/master/map
- https://github.com/cch123/golang-notes/blob/master/map.md
- https://draveness.me/golang-hashmap
- https://lukechampine.com/hackmap.html
defer / panic / recover
在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量
- 当defer被声明时,其参数就会被实时解析
函数返回的过程是这样子的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。
- defer执行顺序为先进后出
私有仓库不支持https,如何拉取
Gorm使用sqlite(纯GO)
|
|