golang
文章平均质量分 75
zone7_
这个作者很懒,什么都没留下…
展开
-
从源码剖析Golang的切片是如何扩容的?
最近在跟小伙伴讨论 Golang 切片的扩容机制,好一些文章的结论都是错误的。在这里,我也带着好奇心去翻阅了源码。那么我就把我理解的 Golang 扩容机制梳理一下。如果当前所需容量 (cap) 大于原先容量的两倍 (doublecap),申请容量(newcap)为当前所需容量(cap),再在此的基础上进行内存对齐,对齐之后,则为最终的容量。至于 newcap 最终是怎么计算的?详见底下的源码展示如果当前所需容量(cap)小于原来容量的两倍(doublecap),则:如果原切片长度(old.len)小于10原创 2022-06-07 23:58:00 · 621 阅读 · 0 评论 -
Golang的defer底层原理是怎么样的?
前言如果你用过 defer ,那么你会大概知道 defer 是用于延迟函数的调用。每次调用 defer 都会将一个函数压入栈中,执行的时候从栈顶取出函数来执行,那么它底层的原理到底是怎么样的?今天我们一起来探究一下。defer 的使用规则延迟函数的参数在defer语句出现时就已经确定下来了func test() { num := 0 defer fmt.Println(num) num = 3 return}输出:0在定义 defer fmt.Println(原创 2022-05-29 16:03:43 · 504 阅读 · 0 评论 -
Golang中的map是线程安全的吗?
答案是否定的Golang 的 map 在设计之初,就不是用来应对线程安全的,设计团队认为有写并发的需求,但是读的需求更为普遍,不想因为写并发去加入一个锁,从而影响了读需求比较多的使用者的性能。上面这段话,有一点点绕,应该也很容易理解,当然,为了应对写并发,在 1.9 版本的时候,就有了 sync.map ,sync.map 是线程安全的。map 的底层是怎么样的?关于 map 的底层,它是一个叫 hmap 的结构体,我们可以查看一下源码:(我的 go 版本 1.17)/在你的 go 目录下 /go原创 2022-05-26 12:01:51 · 1153 阅读 · 0 评论 -
Golang的channel底层是怎么实现的?
前言上次分享了 goroutine 的底层原理和 GMP 的调度模型,这次来看看 Golang 的 channel 底层是怎么实现的?本文为作者原创,转载请注明出处。什么是 channel简单地说,channel 是管道,负责 goroutine 之间的消息传递和事件通知。如何理解 channel 的结构体关于 channel 的底层,它是一个叫 hchan 的结构体,我们可以查看一下源码:(我的 go 版本 1.17)/在你的 go 目录下 /go/src/runtime/chan.goc原创 2022-05-26 01:19:11 · 514 阅读 · 0 评论 -
深入理解 goroutine 底层原理与 GMP 调度模型
,goroutine,线程内存 占用,“创建一个goroutine 的栈内存消耗为2KB,实际 运行过程中,如果栈空间不够用,会自动进行 扩容”,创建一个线程的栈内存消耗为1MB创建 和销 毀,“goroutine 因为是由Go runtime负责管理的,创 建和销毁的消耗非常小,是用户级。”,“线程创建和销毀都会有巨大的消耗,因为要和操 作系统打交道,是内核级的,通常解决的办法就 是线程池”切换,“goroutines 切换只需保存三个寄存器: PC、 SP、BP goroutine 的切换约为20原创 2022-05-25 21:25:37 · 817 阅读 · 0 评论