[转载]Go 内存分配器的设计与实现

原文链接 https://mp.weixin.qq.com/s/TO_lmlFbVDgFmns9s_mMzw

程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域 — 栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由工程师主动申请和释放内存,Go 以及 Java 等编程语言会由工程师和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。

不同的编程语言会选择不同的方式管理内存,本节会介绍 Go 语言内存分配器,详细分析内存分配的过程以及其背后的设计与实现原理。

使用coding自动同步和部署Github项目

coding 提供了一套免费的静态页面服务,还可以自定义域名,本人的 airaNg 服务页面也是部署在coding的静态页面服务当中。不过 ariaNg 还会不断更新,如何在 ariaNg 原项目版本升级后自动更新自己部署的在 coding 的页面呢,这里利用 coding 自带的持续集成功能来完成这种自定义的操作。

目前coding的静态页面服务已进行了修改,使用腾讯云的 oss 和 cdn 来部署了,虽然速度和稳定性有了提升,但可能也会产生费用。

range 数组和切片的差异

Go 语言的 range 表达式遵循如下两个规则:

  1. range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代
  2. range表达式的求值结果会被复制,也就是说,被迭代的对象是range表达式结果值的副本而不是原值