基本原语channel&select源码剖析

channel hchan Go 语言的 Channel 在运行时使用 runtime.hchan 结构体表示。我们在 Go 语言中创建新的 Channel 时,实际上创建的都是如下所示的结构: 实现 Channel 的结构并不神秘,本质上就是一个 mutex 锁

规范化git-commit信息

前言 在 git 的使用中,一种最佳实践是使用格式化的 commit 信息,这样方便自动化工具进行处理,可以快速生成 Release Notes,甚至可以直接对接 CI 工具进行更进一步

Go中的测试技巧

前言 Go 使编写测试非常简单。实际上,测试工具是内置在标准工具链里的,你可以简单地运行 go test 来运行你的测试,无需安装任何额外的依赖或任何别的东西。

Go如何生成随机数

math/rand 包 math/rand 包实现了伪随机数生成器 主要方法 (1)func Seed(seed int64) 设置随机种子,不设置则默认Seed(1) (2)func Int() int 返回一个非负的伪随机int值

如何实现gin的timeout-Middleware

前言 说到Golang中应用最广泛的web框架,恐怕非gin-gonic/gin莫属了。在服务中,如果它依赖的后端服务出现异常,我们希望错误能

Godoc介绍

go doc go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。 所谓Go语言的程

Yaml语法介绍

简介 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:&ldquo

Go的栈空间管理源码剖析

设计原理 栈区的内存一般由编译器自动进行分配和释放,其中存储着函数的入参以及局部变量,这些参数会随着函数的创建而创建,函数的返回而消亡,一般不

Go服务的优雅关闭与重启

背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来

扩展并发原语ErrGroup源码剖析

ErrGroup ErrGroup是 Go 官方提供的一个同步扩展库。我们经常会碰到需要将一个通用的父任务拆成几个小任务并发执行的场景,其实,将一个大的任务拆成几

Go中的Data-Race

数据竞争与竞态条件 数据竞争 定义:①多个线程对于同一个变量、②同时地、③进行读/写操作的现象并且④至少有一个线程进行写操作。(也就是说,如果所

Go的垃圾回收源码剖析

垃圾分类 垃圾分为以下两类: 语义垃圾(semantic garbage): 有的被称作内存泄露 语义垃圾指的是从语法上可达(可以通过局部、全局变量引用得到)的对象,

Go的信号处理源码剖析

信号与软中断 信号机制是 UNIX、类 UNIX 甚至其他 POSIX 兼容系统上规定的一种进程异步通信的限制形式。 用于提醒某个事件的发生状态。 信号被定义为整数,产生

Go的内存分配源码剖析

设计原理 内存管理的三个角色: Mutator:fancy(花哨的) word for application,其实就是你写的应用程序,它会不断地修改对象的引用

Linux的网络IO模型

用户空间与内核空间 现代操作系统都是采用虚拟存储器,那么对 32 位操作系统而言,它的寻址空间(虚拟存储空间)为 4G(2 的 32 次方)。操作系统的核心是

Go进程的生命周期源码剖析

runtime Go 语言是一⻔有 runtime 的语言,那么 runtime 是什么? 可以认为 runtime 是为了实现额外的功能,而在程序运行时自动 加载/运行的一些模块。 Go 语言的 runtime 包括: 这些模块中,

Go的网络轮询器源码剖析

导言 Go 基于 I/O multiplexing 和 goroutine scheduler 构建了一个简洁而高性能的原生网络模型(基于 Go 的 I/O 多路复用 netpoller ),提供了 goroutine-per-connection 这样简单的网络编程模式。在这种模式下,开发者使用的

Go的系统监控源码剖析

设计原理 Go 语言的系统监控起到了很重要的作用,它在内部启动了一个不会中止的循环,在循环的内部会轮询网络、抢占长期运行或者处于系统调用的 Goroutine 以及触

Opentracing包解析

Variables 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var ( // ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or // Tracer.Extract() is not recognized by the Tracer implementation. ErrUnsupportedFormat = errors.New("opentracing: Unknown or unsupported Inject/Extract format") // ErrSpanContextNotFound occurs when the `carrier` passed to // Tracer.Extract() is valid and uncorrupted but