![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go底层
文章平均质量分 74
用心做每一步
一念·
这个作者很懒,什么都没留下…
展开
-
Mutex和RWMutex
锁的实现原理(Mutex和RWMutex)sync.Mutex(互斥锁)为什么需要锁在高并发或多goroutine同时执行时,可能会写入同一块内存var count intvar mu sync.Mutexfunc func1(){ for i :=0;i < 1000; i++{ go func(){ count =count+1 }() } time.Sleep(time.Second) fmt原创 2022-03-31 19:54:36 · 513 阅读 · 0 评论 -
panic和recover的实现原理
panic和recoverpanicpanic的数据结构type _panic struct{ argp unsafe.Pointer //defer的参数空间地址 arg interface //panic的参数 link *_panic //链接之前的panic recovered bool//是否被恢复 aborted bool //是否被终止}同defer一样,每个goroutine数据结构中实际上也有一个panic链表指针,该指针指向一个panic的单链表,每次执行一个pa原创 2022-03-22 20:49:34 · 416 阅读 · 0 评论 -
go语言方法的底层解析
方法方法本质上就是普通的函数,而接受者就是隐含的一个参数对象案例1:(值类型接收者)type A struct{ name string}func (a A)Name (string){ a.name ="Hi!"+a.name return a.name}func main(){ a := A(name:"zxp") fmt.Println (a.Name())go语言中传参值拷贝,所以局部变量a被拷贝到参数空间,如下图:字符串string数据结构中有原创 2022-03-20 16:37:29 · 552 阅读 · 0 评论 -
闭包底层分析
闭包1. 什么是闭包在一个外函数中定义一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。通俗的讲就是在函数内部引用了函数内部的变量的函数案例Go语言中通过匿名函数实现闭包的func adder()func()int{ c=2 return func()int{ return c }}func main(){ fl := adder() f2 := adder() fmt.Println(f1()) fmt.Println(原创 2022-03-20 09:28:44 · 286 阅读 · 0 评论 -
go语言map底层学习
文章目录map数据结构bucket 数据结构键值对存储(key, value)查找过程hash冲突负载因子扩容扩容的条件增量扩容map数据结构Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket就保存了map中的一个或一组键值对。map数据结构由runtime/map.go:hmap定义:type hmap struct{ count int //当前保存的数据元素 ... B uint8 ... buckets unsaf原创 2022-03-09 21:59:45 · 653 阅读 · 1 评论 -
对defer的认识
deferdefer内部结构源码包src/runtime/panic.go定义了两个方法分别用于创建defer和执行defer。deferproc(): 在声明defer处调用,其将defer函数存入goroutine的链表中;deferreturn():在return指令,准确的讲是在ret指令前调用,其将defer从goroutine链表中取出并执行。可以简单这么理解,在编译阶段,声明defer处插入了函数deferproc(),在函数return前插入了函数deferreturn()。原创 2022-03-12 17:33:23 · 1539 阅读 · 0 评论 -
函数底层传参和返回值解析
文章目录函数调用栈函数栈帧函数传参值传递指针传递函数返回值函数调用栈func A(){ ... ...}func B(){ ... ...}我们按照编程语言的语法定义的函数,会被编译成一堆机器指令,写入可执行文件,程序执行时,可执行文件加载到内存,这些机器指令对应到虚拟地址空间中,位于代码段,如下图如果在一个函数中调用另一个函数,编译器就会对应生成一条call指令,程序执行到这条指令的时候,就会跳转到被调用函数入口处开始执行,每个函数的最后都有一条ret指令,负责在函数结束后跳回到原创 2022-03-10 16:40:40 · 191 阅读 · 0 评论 -
切片底层学习
切片的数据结构切片本身并不是动态数组或数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似于数组指针的一种封装。切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个与指向数组的动态窗口。切片的长度可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个长度可变的数组。Slice的数据结构定义如下type slice struc原创 2022-03-08 22:18:33 · 746 阅读 · 0 评论