7.27
string底层实现,
type stringStruct struct {
str unsafe.Pointer
len int
}
channel底层实现,
redis分布式锁实现, redis的SETNX方法。
幂等,
余额支付增加交易流水号,使用订单号+用户id作为唯一索引。
cap,
gmp模型,
多路复用,
es,
英文单词颠倒。(空间复杂度)先将每个单词颠倒,然后逆序输出字符串,
map非线程安全的体现。
同时写入相同的key会报致命错误,fatal error: concurrent map writes(致命错误:并发映射写入)
变量逃逸,以及分析。
go run命令加-m参数,查看内存分配情况。
指针逃逸:典型的逃逸case,函数返回局部变量的指针。
栈空间不足逃逸:当对象大小超过的栈帧大小时(详见go内存分配),变量对象发生逃逸被分配到堆上。
闭包引用逃逸
动态类型逃逸:当对象不确定大小或者被作为不确定大小的参数时发生逃逸。
切片或map赋值:在给切片或者map赋值对象指针(与对象共享内存地址时),对象会逃逸到堆上。但赋值对象值或者返回对象值切片是不会发生逃逸的。
linux
b+树为什么矮胖,
不同的是,B+树中间节点没有卫星数据(索引元素所指向的数据记录),只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”
http,
golang gc,
InnoDB数据在硬盘上是如何存放的,
tcp断开链接时候会发送信号,
redis实现,LRU淘汰,使用双向链表,将最新访问的放到队头,淘汰的时候淘汰末尾。
defer
return先执行,defer进行收尾工作。
函数的返回值有可能被defer更改,本质原因是return xxx语句并不是一条原子指令,执行过程是: 保存返回值(若有)-->执行defer(若有)-->执行return跳转。
每遇到一个defer关键字,defer函数都会被转换成runtime.deferproc
deferproc通过newdefer创建一个延迟函数,并将这个新建的延迟函数挂在当前goroutine的_defer的链表上。
_defer是关联到当前的g,所以defer只对当前g有效。
通过前面的源码解析可以知道,defer会先调用deferproc,这些都会进行参数拷贝,deferreturn还会提取相关信息延迟执行,这些都是比直接call一条语句消耗更大。
defer的两次更新:https://www.jb51.net/article/181683.htm
本文地址:https://blog.csdn.net/zaimeiyeshicengjing/article/details/107618752
上一篇: 暑期CTF练习——第四周
下一篇: 在Debian上安装部署纸壳CMS