在很多 golang 程序中,虽然用到了指针,但是并不会对指针进行加减运算,这和 C 程序是很不一样的。Golang 的官方入门学习工具(go tour) 甚至说 Go 不支持指针算术。虽然实际上并不是这样的,但我在一般的 go 程序中,好像确实没见过指针运算(嗯,我知道你想写不一般的程序)。 但实际上,go 可以通过unsafe.Poin...
"今天讲一个常见的gc compiler(也就是官方版本的go编译器和runtime)在垃圾回收的扫描标记阶段做的优化。我对这个优化的描述印象最深的是在bigcache的注释里,大致内容是如果map的键值都不包含指针,那么gc扫描的时候不管这个map多大都不会深入扫描map内部存储的数据,只检查map本身是否需要回收。
解释下上面的这段代码,我们创建了一个FooOption的函数类型,这个函数类型代表的函数结构是func(foo *Foo),很简单,将foo指针传递进去,能让内部函数进行修改。 然后我们定义了三个返回了FooOption的函数: WithName WithAge WithDB 以WithName为例,这个函数参数为string,返回值为FooOption。在返回值的FooOption中,根据...
所以总结下,只要创建的对象不包含指针(例如数组/切片成员都是不包含指针的类型,map的键值对都不包含指针,结构体所有字段不包含指针)或者只是单纯分配块内存(makeslicecopy里分配一块内存然后再把数据copy进去的时候会判断element里包不包含指针,不包含的时候会传nil给mallocgc),noscan就会被设置。 现在所有的疑问都解决...
灰色对象 — 活跃的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象; Mark-Sweep算法可以描述如下(广度优先遍历): 将根对象全部标记为灰色 从灰色对象的集合中选择一个灰色对象并将其标记成黑色; 将黑色对象指向的所有对象都标记成灰色,保证该对象和被该对象引用的对象都不会被回收; 重复上述...
Go语言的垃圾回收机制会自动管理内存,但过度使用指针可能导致不必要的内存逃逸。理解并合理利用内存逃逸分析,能有效优化程序性能: // 示例1:未发生逃逸funccreateArray()[10]int{return[10]int{}}// 示例2:发生逃逸,因为返回的是指向堆内存的指针funccreateSlice()*[]int{slice:=make([]int,10)return&slice} ...
sigprof 首先会调用 gentraceback 得到当前协程正在执行的调用栈。gentraceback 比较复杂,好在大致流程是比较清晰的。简化后的代码如下图,for循环 max 次,从程序计数器 pc、栈指针 sp、链接寄存器 lr 取出当前协程的 max 层调用栈信息,保存在 pcbuf 中;profile 采样下 max 取值为64,只取64层级的栈信息。
100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针 摘要: 本篇文章主要深入解析Go语言中的指针,从指针的概念、获取变量地址,声明指针,空指针,获取指针的值,操作指针改变变量的数值,使用指针传递函数的参数,以及指针的指针等方面进行讲解和示例演示。
RingBuffer 天然合适,但是RingBuffer 存满后需要扩容,扩容需要copy,copy 会造成data race(read/write 指针不能碰面)。再进一步,如何实现一个无锁的ring buffer?使用链表解决扩容问题;使用sync.Pool 复用链表节点;维护一个length字段,通过atomic 避免data race。