当前位置: 移动技术网 > 网络运营>服务器>Linux > 7.27

7.27

2020年07月29日  | 移动技术网网络运营  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网