跳至主要內容
Go 内存管理设计与实现

Go 内存管理设计与实现

概述

冯·诺伊曼的设计理念的指导下,计算机将计算存储这个两大核心模块进行分离,二者通过总线连接,协调工作:

对于计算而言,CPU 无疑是核心(CPU 内部结构无需过多关注),但对于存储而言,则要麻烦的多。


pedrogao大约 39 分钟gogomemory
从 Hello World 来看看 go 的运行流程

一直以来我们都在享受 Go 语言带来的便利,却不知道它一直在为我们负重前行。本文我们将从底层出发,从 Hello World 这个最基本例子来看看 Go 是如何运行的。重新审视 Hello World,保持对 Hello World 的敬畏。

本文涉及知识点有:

  • plan9 汇编
  • GMP 模型
  • 系统调用
  • 进程与线程
  • 。。。

为了帮助大家能够更好的理解 Go 运行流程,这里会先介绍一些前置知识,如果你已经熟稔于心可以直接选择跳过,如果你还一知半解,那么请随我一起来回顾回顾。


pedrogao大约 38 分钟gogoruntime
go 汇编简单入门

在 Go runtime 中存在了大量由 plan9 汇编书写的代码,想要了解 runtime 的实现和机制,掌握 plan9 汇编的基本使用是必须的。(Go 的作者们在选择汇编语言的时候没有选择 intel,也没有选择 AT&T,而是选择了 plan9,哎,一群固执老古董们)。

plan9 语法虽然与 intel 和 AT&T 略有不同,但整体而言相差不大,如果你之前有其它汇编语言的基本,相信入手也很快。

下面会介绍一些 plan9 中的常见语法,想要深入了解的可以查看本文的参考资料。

基本介绍

寄存器


pedrogao大约 7 分钟gogoplan9assembly
go 另外几个黑魔法技巧

go 另外几个黑魔法技巧

在上一篇文章中,笔者分享了 go 中两个有意思的技巧。

而最近一段时间,笔者重新梳理了一下 go 知识点,并深入地看看了它的源码,在实践中又有了新的沉淀,于是写下这篇文章和大家分享一下。

魔法 1:最小化运行时(minimal runtime)

我们知道,go 有一层很重的运行时(runtime),包括内存管理、goroutine 调度等重要组件;这些组件极大地方便了应用程序的开发和迭代,但也带来了一些问题,比如:


pedrogao大约 18 分钟gogomagic
go 泛型尝鲜,实现一个流式处理库

go 泛型尝鲜,实现一个流式处理库

背景

熟悉 Java、Rust 的同学,肯定都非常喜欢其 Stream API,以 Java 为例,筛选一个简单的数字列表,可以有如下实现:

boolean ok = Stream.of(1, 2, 3, 4, 5).
            map(item -> item + 100).
            filter(item -> item > 102).
            allMatch(item -> item > 102);

pedrogao大约 13 分钟gogogenerics
go 的两个黑魔法技巧

go 的两个黑魔法技巧

最近,在写 Go 代码的时候,发现了其特别有意思的两个奇技淫巧,于是写下这篇
文章和大家分享一下。

魔法 1:调用 runtime 中的私有函数

按照 Go 的编译约定,代码包内以小写字母开头的函数、变量是私有的:

package test

// 私有
func abs() {}

// 公共
func Abs() {}

pedrogao大约 12 分钟gogomagic
go pool 池化学习、实践总结

go pool 池化学习、实践总结

概述

最近在业务性能优化过程中,大量使用到了 pool 池化、缓存等技术。在用 pool 的时候一知半解
地怼了上去,待上线过后就得抽时间系统学习、总结一下,于是就有了这篇文章。

首先,我们从一个场景出发,在一个简单的 http 接口服务中,如下:

func handleV1(writer http.ResponseWriter, req *http.Request) {
	var (
		err  error
		data []byte
	)
    // ....
	data, err = ioutil.ReadAll(req.Body)
	if err != nil {
		return
	}
	// ...... json.Unmarshal 之类的
}

pedrogao大约 10 分钟gogopool