欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

7.27

程序员文章站 2022-03-06 15:57:09
string底层实现,channel底层实现,redis分布式锁实现, redis的SETNX方法。幂等,cap,gmp模型,多路复用,es,英文单词颠倒。(空间复杂度)先将每个单词颠倒,然后逆序输出字符串,map非线程安全的体现。同时写入相同的key会报致命错误,fatal error: concurrent map writes(致命错误:并发映射写入)变量逃逸,以及分析。linuxb+树为什么矮胖,......

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