Golang 中 defer Close() 的潜在风险

2021-11-22
阅读 4 分钟
2.9k
作为一名 Gopher,我们很容易形成一个编程惯例:每当有一个实现了 io.Closer 接口的对象 x 时,在得到对象并检查错误之后,会立即使用 defer x.Close() 以保证函数返回时 x 对象的关闭 。以下给出两个惯用写法例子。

一文读懂 Go sync.Cond 设计

2021-10-27
阅读 7 分钟
5.9k
Go 语言通过 go 关键字开启 goroutine 让开发者可以轻松地实现并发编程,而并发程序的有效运行,往往离不开 sync 包的保驾护航。目前,sync 包的赋能列表包括: sync.atomic 下的原子操作、sync.Map 并发安全 map、sync.Mutex 与 sync.RWMutex 提供的互斥锁与读写锁、sync.Pool 复用对象池、sync.Once 单例模式、 sync.W...

详解 Go 中 WaitGroup 设计

2021-09-08
阅读 8 分钟
4.2k
Go语言提供的协程goroutine可以让我们很容易地写出多线程程序,但是,如何让这些并发执行的goroutine得到有效地控制,这是我们需要探讨的问题。正如小菜刀在《Golang并发控制简述》中所述,Go标准库为我们提供的同步原语中,锁与原子操作注重控制goroutine之间的数据安全,WaitGroup、channel与Context控制的是它们的并...

Go函数调用惯例

2021-08-04
阅读 6 分钟
4.3k
在程序代码中,函数提供了最小功能单元,程序执行实际上就是函数间相互调用的过程。在调用时,函数调用方和被调用方必须遵守某种约定,它们的理解要一致,该约定就被称为函数调用惯例。

如何有效地测试Go代码

2021-07-29
阅读 9 分钟
1.9k
如果把开发程序比作盖房子,那么我们必须确保所有的用料都是合格的,否则盖起来的房子就会存在问题。对于程序而言,我们可以将盖房子的砖头、钢筋、水泥等当做一个个功能单元,如果每个单元是合格的,我们将有信心认为程序是健壮的。单元测试(Unit Test,UT)就是检验功能单元是否合格的工具。

Go append 扩容机制

2021-07-27
阅读 9 分钟
7.5k
为什么结果不是5,不是8,而是6呢?由于小菜刀在该文中关于扩容的描述不够准确,让读者产生了疑惑。因此本文想借此机会细致分析一下append函数及其背后的扩容机制。

Golang 读写锁设计

2021-07-26
阅读 5 分钟
4.8k
在《Go精妙的互斥锁设计》一文中,我们详细地讲解了互斥锁的实现原理。互斥锁为了避免竞争条件,它只允许一个线程进入代码临界区,而由于锁竞争的存在,程序的执行效率会被降低。同时我们知道,只有多线程在共享资源中有写操作,才会引发竞态问题,只要资源没有发生变化,多线程读取相同的资源就是安全的。因此,我们引...

Go精妙的互斥锁设计

2021-07-26
阅读 11 分钟
2.6k
Some people, when confronted with a problem, think, “I know, I’ll use threads,” and then two they hav erpoblesms.

Go同步原语的基石

2021-04-07
阅读 5 分钟
3.5k
Go是一门以并发编程见长的语言,它提供了一系列的同步原语方便开发者使用,例如sync包下的Mutex、RWMutex、WaitGroup、Once、Cond,以及抽象层级更高的Channel。但是,它们的实现基石是原子操作。需要记住的是:软件原子操作离不开硬件指令的支持。本文拟通过探讨原子操作——比较并交换(compare and swap, CAS)的实现,来...

详解Go内联优化

2021-02-01
阅读 4 分钟
10.6k
为了保证程序的执行高效与安全,现代编译器并不会将程序员的代码直接翻译成相应地机器码,它需要做一系列的检查与优化。Go编译器默认做了很多相关工作,例如未使用的引用包检查、未使用的声明变量检查、有效的括号检查、逃逸分析、内联优化、删除无用代码等。本文重点讨论内联优化相关内容。

CPU缓存体系对Go程序的影响

2021-01-12
阅读 10 分钟
3.8k
小菜刀最近在medium上阅读了一篇高赞文章《Go and CPU Caches》,其地址为[链接],感觉收获颇多。小菜刀在该文章的基础上做了些修改和扩展,整理出来分享给读者朋友们。

一文读懂Channel设计

2020-11-25
阅读 13 分钟
4.1k
现代操作系统中为我们提供了三种基本的构造并发程序的方法:多进程、I/O多路复用和多线程。其中最简单的构造方式当属多进程,但是多进程的并发程序,由于对进程控制和进程间通信开销巨大,这样的并发方式往往会很慢。