30、原子操作(下)你好,我是郝林,今天我们继续分享原子操作的内容。 我们接着上一篇文章的内容继续聊,上一篇我们提到了,sync/atomic包中的函数可以做的原子操作有:加法(add)、比较并交换(compare and swap,简称CAS)、加载(load)、存储...2026-01-19Go语言核心36讲
31、sync.WaitGroup和sync.Once我们在前几次讲的互斥锁、条件变量和原子操作都是最基本重要的同步工具。在Go语言中,除了通道之外,它们也算是最为常用的并发安全工具了。 说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式看起来都似乎有些蹩脚。 比如:声明一个通道,使它的...2026-01-19Go语言核心36讲
32、context.Context类型我们在上篇文章中讲到了sync.WaitGroup类型:一个可以帮我们实现一对多goroutine协作流程的同步工具。 在使用WaitGroup值的时候,我们最好用“先统一Add,再并发Done,最后Wait”的标准模式来构建协作流程。 如果在调用该...2026-01-19Go语言核心36讲
33、临时对象池sync.Pool到目前为止,我们已经一起学习了Go语言标准库中最重要的那几个同步工具,这包括非常经典的互斥锁、读写锁、条件变量和原子操作,以及Go语言特有的几个同步工具: sync/atomic.Value; sync.Once; sync.WaitGroup c...2026-01-19Go语言核心36讲
34、并发安全字典sync.Map (上)在前面,我几乎已经把Go语言自带的同步工具全盘托出了。你是否已经听懂了会用了呢? 无论怎样,我都希望你能够多多练习、多多使用。它们和Go语言独有的并发编程方式并不冲突,相反,配合起来使用,绝对能达到“一加一大于二”的效果。 当然了,至于怎样配合就是一...2026-01-19Go语言核心36讲
35、并发安全字典sync.Map (下)你好,我是郝林,今天我们继续来分享并发安全字典sync.Map的内容。 我们在上一篇文章中谈到了,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},所以我们在调用这些方法的时候,往往还需要对键和值的实际类型进...2026-01-19Go语言核心36讲
36、unicode与字符编码到目前为止,我们已经一起陆陆续续地学完了Go语言中那些最重要也最有特色的概念、语法和编程方式。我对于它们非常喜爱,简直可以用如数家珍来形容了。 在开始今天的内容之前,我先来做一个简单的总结。 Go语言经典知识总结基于混合线程的并发编程模型自然不必多说...2026-01-19Go语言核心36讲
37、strings包与字符串操作在上一篇文章中,我介绍了Go语言与Unicode编码规范、UTF-8编码格式的渊源及运用。 Go语言不但拥有可以独立代表Unicode字符的类型rune,而且还有可以对字符串值进行Unicode字符拆分的for语句。 除此之外,标准库中的unicod...2026-01-19Go语言核心36讲
38、bytes包与字节串操作(上)我相信,经过上一次的学习,你已经对strings.Builder和strings.Reader这两个类型足够熟悉了。 我上次还建议你去自行查阅strings代码包中的其他程序实体。如果你认真去看了,那么肯定会对我们今天要讨论的bytes代码包,有种似...2026-01-19Go语言核心36讲
39、bytes包与字节串操作(下)你好,我是郝林,今天我们继续分享bytes包与字节串操作的相关内容。 在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展。 知识扩展问题 1:bytes.Buffer的扩容策...2026-01-19Go语言核心36讲