多年老司机,面对这些Go并发问题,也迟疑了 (colobu.com)

【简介】

Go一向以它的简单易学而著称,我也遇到过同学说只需半天就能掌握Go语言了,两三年的Go开发经验就称专家了。

想比较Rust等编程语言,Go语言的确容易上手,查看Go语言的规范你也会看到,它的语言规范相比较其它编程语言非常的简短,的确可以一个小时就可以读完。但是如果你深入了解这门语言(其它语言也是类似情况),就会发现很多细节的地方,需要花谢心思和时间仔细琢磨琢磨。这不,我先来几道Go并发的源代码考考你,看看你能回答上来不?

点击查看全文 >>

@技术头条 2022-12-18 20:08分享 / 原作者微博:@colobu / 0个评论
赞过的人: @IT技术博客大学习
要不要再学学下面的文章?
短 ID hash 映射的问题 (blog.codingnow.com)
我们正在开发的游戏中,会用一个 id 来表示一个游戏对象到底是什么。比如,“铁片” 是 1 ,“煤” 是 2 ,“采矿机” 是 3 …… 这样,在运行时,C 代码可以根据对象的类型方便的查询对象的属性。而对象的属性则是用 Lua 配置好,在运行期不变的。例如每燃烧一个单位的“煤”,可以产生 100KJ 的热量;一箱“铁片”有 100 个。

为了在 C 和 Lua 间快速共享这些配置数据,我还专门写了一个 cache 模块 。

问题出在 ID 的持久化上。因为游戏中的物品种类并不是特别多,出于时间以及空间性能的考量,我把 ID 设计为 16bits 。64K 种物品种类的上限看起来足够了。但 ID 的分配却比较麻烦。
by @技术头条 2023-04-09 10:06 分享 查看详情
同一 Entity 包含多个同类 Component 的问题 (blog.codingnow.com)
ECS 中,同一个 Entity 是否可以由多个同类型的 Component 构成?在 Unity 中,答案是可以。我们的引擎在设计之初也是可以的。
当时有一个问题:在 Lua 中,如何访问同类型的 Component ?如果有多个同类 Component ,最自然的方式是把它们放在一个数组里。但是、绝大多数情况下我们用不上这个特性,每次访问 Component 都加一次 [1] 或 [0] 的数组索引显得画蛇添足。若单个 Component 不用数组,多个才用数组,写起来又有极大的心智负担。因为这样做,它们就成了两个不同的类型。
后来,我们干脆利用 Lua 的特性,把数组和 Component 本身放在一个 table 中。如果有多个 Component 就把这个数组直接放在第一个 Component 的 table 内。就这样用了一段时间后,最后还是受不了这个脏技巧。等到用 C 编写 luaecs 后,就砍掉了这个特性。
by @技术头条 2023-02-12 14:00 分享 查看详情
Rust 并发编程实战课 (colobu.com)
Rust 越来越得到广泛的应用,尤其对于追求性能的系统编程领域,最近还正式进入了Linux 内核的主干,并预计在 6.1 版本中正式使用。

Rust 虽然设计理念独树一帜,性能也是那么的优秀,但是学习起来并不简单,学习曲线很陡。同时由于Rust不像Go语言一样,不受某一家公司的控制,看起来在开源方面貌似很“Open”,所以也得到了广大开发者的青睐,贡献了许多库,不乏高质量的库,甚至比标准库的质量和使用率还高,这也带来了一些问题。其他语言,比如Go语言,它的标准库相当的优秀,比如一堆优秀高质量的并发原语,在开发者在开发并发程序的时候,需要同步控制和任务编排时,脑海中第一选择就是标准库的并发原语,实在找不到合适的并发原语才去找第三方的库。但是Rust不一样,虽然标准库也提供了一些优秀的并发原语,但是限于语言的特性,使用起来相当的复杂,也有很多第三方的库提供性能更好或者特性更多或者更易使用的功能,所以在使用Rust开发并发程序的时候,很多开发者对并发逻辑的控制无从下手,或者有“选择困难症”,所以我专门开了一个序列,准备系统的介绍 Rust的并发编程的知识,通过一百多个简短而明确的例子,全面介绍Rust的并发编程和相关库的使用:rust programming via rust .
by @技术头条 2022-12-18 20:46 分享 查看详情
零拷贝技术第二篇:Go语言中的应用 (colobu.com)
书接上回:零拷贝技术第一篇:综述, 我们留了一个小尾巴,还没有介绍Go语言中零拷贝技术的应用,那么本文将带你了解Go标准库中零拷贝技术。
by @技术头条 2022-12-18 20:43 分享 查看详情
Go CPU profiler 内幕 (colobu.com)
Go 是那种自带 profiler (分析器)的语言之一。它的运行时包含强大的自成一派的各种 profiler。其它语言,比如 Ruby、Python 和 Node.js, 它们也包含 profiler或者一些用来编写profiler的API,但是与Go的开箱即用的 profiler相比,它们提供的profiler功能有限。如果你想多了解Go提供的这些可观察工具的情况,我强烈推荐你阅读 Felix Geisendörfer的 The Busy Developer’s Guide to Go Profiling, Tracing and Observability。

作为一个好奇的工程师,我喜欢挖掘事物在底层上的工作方式,我一直想去学习Go CPU profiler底层·是怎么工作的。这篇文章就是此次探索的结果。每当我阅读Go运行时代码时,我总是学到到一些新东西,这次也不例外。
by @技术头条 2022-12-18 20:08 分享 查看详情
与日俱进,在 Go 1.20 中这种高效转换的方式又变了 (colobu.com)
在 Go 1.19 的开发中, string.SliceHeader和string.StringHeader经历了一个生死存亡的争斗,这两个类型一度被标记为弃用(deprecated),但是这两个类型经常用在 slice of byte 和 string 高效互转的场景中,如果被标记为弃用,但是目前还没有可替代的方法,所以这两个类型又把弃用标记去掉了,如无意外,它们也会在 Go 1.20 再次被标记为弃用。
by @技术头条 2022-09-12 22:38 分享 查看详情
啊哈,一道有趣的Go并发题 (colobu.com)
今天一位同学给我出了一道并发题,作为在极客时间开了《GO并发编程实战课》的作者,居然一时间没有回答上来,惭愧啊,所以晚上专门研究了一下题目,给出几个实现方案供探讨。
by @技术头条 2022-09-03 23:26 分享 查看详情
Swift 结构化并发 (onevcat.com)
async/await 所引入的异步函数的简单写法,可以在暂停点时放弃线程,这是构建高并发系统所不可或缺的。但是异步函数本身,其实并没有解决并发编程的问题。结构化并发 (structured concurrency) 将用一个高效可预测的模型,来实现优雅的异步代码的并发。
by @技术头条 2022-08-31 23:19 分享 查看详情
如何面对数据项目开发和管理中的挑战 (insights.thoughtworks.cn)
近几年,随着数据和人工智能越来越受关注,数据与人工智能项目(统称数据项目)也遍地开花,和传统应用类项目相比,数据项目有其自身的特点和挑战,本文就来盘一下这些挑战。
by @Thoughtworks 2022-08-30 16:45 分享 查看详情
Go并发编程一年回顾 (colobu.com)
距离我2019年的深入Go并发编程研讨课发布也有一年时间了。在Gopher Beijing 2019相关演讲后我整理了这一个8小时的课程,对有志于深入理解Go并发编程原理的同学从深度和广度上提供一些帮助。当然一年来我也一直关注着Go并发编程的演变,并且补充了池和并发模式的一些例子。对于官方的并发库来说,这一年来又有哪些变化呢,让我们快速回顾一下。
by @技术头条 2022-08-19 00:06 分享 查看详情