diff options
| author | Eltrac <hi@guhub.cn> | 2025-11-24 10:55:56 +0800 |
|---|---|---|
| committer | Eltrac <hi@guhub.cn> | 2025-11-24 10:55:56 +0800 |
| commit | 638902527b4e26b6d5ca3d5e7256d56323b0dad6 (patch) | |
| tree | 491de7580003c6a15b3233cc1d0c6e97cef57b04 /content/_drafts | |
| parent | cc2423b6d8c38fadf04ece5efce44fe562ebb779 (diff) | |
docs: post weekly and update draft
Former-commit-id: 7eef3531d7c8d949de255af5ed747d1870960214
Diffstat (limited to 'content/_drafts')
| -rw-r--r-- | content/_drafts/go-philosophy.md | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/content/_drafts/go-philosophy.md b/content/_drafts/go-philosophy.md index a9eedf3e..0a1e6f58 100644 --- a/content/_drafts/go-philosophy.md +++ b/content/_drafts/go-philosophy.md @@ -11,13 +11,13 @@ toc: true 从这个月 10 号,水逆期开始,我就开始减少出门,宅在家里读一读书,捡一捡法语学习,看看音乐剧,还找了些新东西来学,Go 语言就是其中一个。一开始只是抱着好奇心探索,并没有什么功利心,不过越学越发觉,Go 真的很适合用来写高并发高性能的 Web 应用(而且越学越讨厌 Java)。 -学任何一门编程语言我都更喜欢直接上手写代码,一边写一边学基础语法,遇到不知道怎么实现的需求时再查阅文档。不过,这次学 Go 的一开始我发现了 [Go Proverbs](https://go-proverbs.github.io/) 这个网站,便在实战之外还花了不少时间阅读和理解这里的「名言警句」。这些 Go 语言编程相关的谚语大多来自 Rob Pike 在 2015 年的[一场演讲](https://www.youtube.com/watch?v=PAAkCSZUG1c),每一条都很有启发性,这篇文章就来逐条阐述我对它们的理解,其中有不少也可以用在 Go 语言以外的编程下。<!--more--> +学任何一门编程语言我都更喜欢「不自量力」地直接上手写代码,一边写一边学基础语法,遇到不知道怎么实现的需求时再查阅文档。不过,学 Go 的一开始我发现了 [Go Proverbs](https://go-proverbs.github.io/) 这个网站,便在实战之外还花了不少时间研读这里的「名言警句」。这些 Go 语言编程相关的谚语大多来自 Rob Pike 在 2015 年的[一场演讲](https://www.youtube.com/watch?v=PAAkCSZUG1c),每一条都很有启发性,这篇文章就来逐条阐述我对它们的理解,其中有不少也可以用在 Go 语言以外的编程中。<!--more--> ## Don't communicate by sharing memory, share memory by communicating. -这句话直接翻译过来是:不要用共享内存的方式通信,用通信的方式共享内存。 +这句话直接翻译过来是:不要用共享内存的方式通信,要用通信的方式共享内存。 -这其实有些令人费解,需要一些上下文来理解。Go 是一门可以通过非常优雅的方式实现并发的编程语言,异步编程若是要在多个线程之间同步信息,往往需要加锁,这是为了避免线程同时操作内存,导致冲突、数据准确性(integrity)被破坏等无法预测的问题。加锁一般指的是互斥锁(mutual exclusion object,简写作 `mutex`),线程操作数据时需要先获取对应的锁,如果锁被其他线程持有,则需要等待,获取到锁的线程才能执行操作,这保证数据操作是互斥的。 +这需要一些上下文来理解。Go 是一门可以通过非常优雅的方式实现并发的编程语言,异步编程若是要在多个线程之间同步信息,往往需要加锁,这是为了避免线程同时操作内存,导致冲突、数据准确性(integrity)被破坏等无法预测的问题。加锁一般指的是互斥锁(mutual exclusion object,简写作 `mutex`),线程操作数据时需要先获取对应的锁,如果锁被其他线程持有,则需要等待,获取到锁的线程才能执行操作,这保证数据操作是互斥的。 加锁是异步编程中的常见做法[^1],但 Go 程序员认为「锁是痛苦的」,不仅要创建锁、管理锁,还要想办法避免死锁等运行时错误,这类错误没法被编译器察觉,程序员排查起来很困难。所以,为了保证程序的安全性和可读性,应当避免使用锁。使用互斥锁保证数据通信安全的方法,就是这句话的前半句「communicate by sharing memory」,因为共享了内存,所以必须加锁,不然就会出现问题,而锁又会带来更多难题。 |
