channel是golang里很重要的一种数据结构channel的特性channel内部实现buffered channel在底层使用一个struct来实现,使用一个环形缓冲区circular queue来保存元素。向channel发送值channel的buffer已满从channel接收值ps:使用make来创建channel时,go在堆上分配一个hchan struct,然后初始化它,最...
和数组不同的是,slice之间不能比较,我们不能使用==操作符来判断两个slice是否相等。自己总结了下原因:slice在源码中,其实是一个struct,由三部分组成:指针,长度和容量。type slice struct { array unsafe.Pointer len int cap int }如果==使用的是浅度相等,只要两个slice的指针,长度和容...
之前写过一篇关于Go内存分配的文章 - Go内存分配,讲的是Go堆内存的申请过程。对象除了可以在堆上分配,还有一个我们很熟悉的地方可以分配,栈。栈内存分配每一个协程都有自己的栈,协程访问栈的对象时,不需要加锁等同步操作。下面是一个例子:调用main函数,Go在栈上分配内存调用square函数,Go在栈上分配内存当square执行完返回main时,上一步调用square时,分配的内存不会被回收...
编写过C或者C++程序的都知道,我们要手动申请或释放内存。Go的内存是自动管理的,不需要我们考虑内存的申请和释放问题。尽管我们不需要考虑内存的管理问题,但了解Go在内存管理方法做了什么,有助于我们写出高效的程序。先来一张Go内存分配的全局图分配方法顺序分配器当我们在编程语言中使用顺序分配器,我们只需要在内存中维护一个指向内存特定位置的指针,当用户程序申请内存时,分配器只需要检查剩余的空闲内存...
看了一周多的文章,垃圾回收器的实现的确很复杂,而且,Go的垃圾回收实现,每个版本都在改进。Go目前使用的并发(与用户代码并发执行)的三色标记清除算法。如下图Mutator - 用户程序Collector - 垃圾回收器Mutator Assist(或者称为Mark Assist) - 辅助回收器垃圾回收的整个过程下面是各个阶段清理终结阶段 暂停应用程序,为下一阶段的标志阶段做准备工作。标...