<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>函数 on Tony Bai</title><link>https://tonybai.com/tags/%E5%87%BD%E6%95%B0/</link><description>Recent content in 函数 on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Fri, 16 Jan 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/%E5%87%BD%E6%95%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么 Go 社区强调避免不必要的抽象？—— 借用海德格尔哲学寻找“正确”的答案</title><link>https://tonybai.com/2026/01/16/go-community-the-right-kind-of-abstraction/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/16/go-community-the-right-kind-of-abstraction/</guid><description>本文永久链接 – https://tonybai.com/2026/01/16/go-community-the-right-kind-of-abstraction 大家好，我是Tony Bai。 **“Go 的哲学强调避免不必要的抽象。”** 这句话我们听过无数次。当你试图引入 ORM、泛型 Map/Reduce 、接口或者复杂的设计模式时，往往会收到这样的反馈。这句话本身没有错，但难点在于：*...</description></item><item><title>霸榜 GitHub 一周！Google 开源 ADK for Go，彻底终结 AI“炼丹”时代？</title><link>https://tonybai.com/2025/11/24/google-adk-go-in-action/</link><pubDate>Mon, 24 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/24/google-adk-go-in-action/</guid><description>本文永久链接 – https://tonybai.com/2025/11/24/google-adk-go-in-action 大家好，我是Tony Bai。 上周，我花了一个下午，仅仅是为了让一个Python写的Agent能稳定地调用我Go服务里的一个简单函数。在那一刻，看着屏幕上纠缠的gRPC、Python虚拟环境和混乱的日志，我脑海里只有一个念头：这不对劲，这绝对不是软件工程该有的样子！ 显...</description></item><item><title>告别懵圈：实战派 Gopher 的类型理论入门</title><link>https://tonybai.com/2025/10/30/type-theory-intro-for-gopher/</link><pubDate>Thu, 30 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/30/type-theory-intro-for-gopher/</guid><description>本文永久链接 – https://tonybai.com/2025/10/30/type-theory-intro-for-gopher 大家好，我是Tony Bai。 你是否曾有过这样的经历：在浏览一个关于 Go 泛型或接口设计的 GitHub issue 或技术提案时，评论区里的大佬们突然开始讨论 “Sum Type”、“Product Type”、“Parametric Polymorphi...</description></item><item><title>NASA的十大编码“诫律”：Go视角的全新解读</title><link>https://tonybai.com/2025/09/09/the-power-of-ten-in-go/</link><pubDate>Tue, 09 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/09/the-power-of-ten-in-go/</guid><description>本文永久链接 – https://tonybai.com/2025/09/09/the-power-of-ten-in-go 大家好，我是Tony Bai。 在软件工程领域，有些智慧是永恒的。 2006 年，NASA/JPL（喷气推进实验室）的 Gerard J. Holzmann 公布了其团队用于开发**安全关键 (Safety-Critical)** 软件的十条黄金法则——“The Power...</description></item><item><title>告别算法“天书”，Go程序员的学术伪代码“翻译”指南</title><link>https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide/</link><pubDate>Sat, 06 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide/</guid><description>本文永久链接 – https://tonybai.com/2025/09/06/gopher-pseudocode-translation-guide 大家好，我是Tony Bai。 你是否曾在阅读顶会论文时，感觉其中的算法描述像一本晦涩难懂的**“天书”**？那些看不太懂的数学符号、奇特的箭头和看似代码又无法编译的语句(如下图)，是不是常常让你望而却步，感叹理论与实践之间隔着一道鸿沟？ 别担心，...</description></item><item><title>“简单”不是“容易”：Go开发者应该懂的5个道理</title><link>https://tonybai.com/2025/09/04/simple-is-not-easy/</link><pubDate>Thu, 04 Sep 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/09/04/simple-is-not-easy/</guid><description>本文永久链接 – https://tonybai.com/2025/09/04/simple-is-not-easy 大家好，我是Tony Bai。 在软件工程领域，有些演讲如同灯塔，其光芒足以穿透时间的迷雾，持续为后来者指引方向。Clojure语言的创造者Rich Hickey在2011年的Strange Loop大会上发表的“Simple Made Easy”，正是这样一例。他以一种近乎哲学家...</description></item><item><title>我的 Gopher “长期主义”：从《Go语言第一课》新书说起</title><link>https://tonybai.com/2025/08/28/go-primer-published/</link><pubDate>Thu, 28 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/28/go-primer-published/</guid><description>本文永久链接 – https://tonybai.com/2025/08/28/go-primer-published 大家好，我是Tony Bai。 前不久，在知乎上看到一个关于 Go 社区的帖子，其中一条评论让我感慨良多： &amp;gt; **“GopherChina 都没了，国内还有几人坚持？Tony Bai好像还在更新”** 短短一句话，道尽了社区的变迁与坚持的不易。这句来自读者的回答，让我内心欣慰，...</description></item><item><title>Go的“七宗罪”：一篇“Go依然不够好”如何引爆社区激辩？</title><link>https://tonybai.com/2025/08/25/go-is-still-not-good/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/08/25/go-is-still-not-good/</guid><description>本文永久链接 – https://tonybai.com/2025/08/25/go-is-still-not-good 大家好，我是Tony Bai。 在技术圈，平静的湖面下往往暗流涌动。对于Go语言社区而言，这股潜藏已久的暗流，被近期的一篇名为《Go is still not good》的博文彻底引爆。作者Thomas Habets，一位自称拥有超过十年Go使用经验的资深开发者，在他的这篇文章...</description></item><item><title>一个字符引发的30%性能下降：Go值接收者的隐藏成本与优化</title><link>https://tonybai.com/2025/04/25/hidden-costs-of-go-value-receiver/</link><pubDate>Fri, 25 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/25/hidden-costs-of-go-value-receiver/</guid><description>一个字符引发的30%性能下降：Go值接收者的隐藏成本与优化 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关...</description></item><item><title>世界读书日：如何高效阅读“砖头”技术书？我的心法分享（文末赠书）</title><link>https://tonybai.com/2025/04/23/tips-for-reading-technical-books/</link><pubDate>Wed, 23 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/23/tips-for-reading-technical-books/</guid><description>世界读书日：如何高效阅读“砖头”技术书？我的心法分享（文末赠书） - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ ...</description></item><item><title>Go项目设计的“七宗罪”？警惕那些流行的“反模式”</title><link>https://tonybai.com/2025/04/21/go-project-design-antipatterns/</link><pubDate>Mon, 21 Apr 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/04/21/go-project-design-antipatterns/</guid><description>Go项目设计的“七宗罪”？警惕那些流行的“反模式” - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 *...</description></item><item><title>Go方法名的作用域：包级，但需间接调用</title><link>https://tonybai.com/2025/03/24/understand-methodname-scope/</link><pubDate>Mon, 24 Mar 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/03/24/understand-methodname-scope/</guid><description>Go方法名的作用域：包级，但需间接调用 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 文章列表 ...</description></item><item><title>一文搞懂如何在Go包中支持Hash-Based Bisect调试</title><link>https://tonybai.com/2024/11/24/how-to-support-hash-based-bisect-in-go-package/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/11/24/how-to-support-hash-based-bisect-in-go-package/</guid><description>本文永久链接 – https://tonybai.com/2024/mm/dd/how-to-support-hash-based-bisect-in-go-package bisect是一个英文动词，意为“二分”或“分成两部分”。在数学和计算机科学中，通常指将一个区间或一个集合分成两个相等的部分。 对于程序员来说，最熟悉的bisect应用莫过于下面两个： * 算法中的二分查找(binary se...</description></item><item><title>写出Go标准库级别文档注释的十个细节</title><link>https://tonybai.com/2024/10/27/ten-details-when-using-documentation-comments/</link><pubDate>Sun, 27 Oct 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/10/27/ten-details-when-using-documentation-comments/</guid><description>写出Go标准库级别文档注释的十个细节 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 写出Go标准库级别文档注释的十...</description></item><item><title>重拾精髓：go doc -http让离线包文档浏览更便捷</title><link>https://tonybai.com/2024/09/06/go-doc-add-http-support/</link><pubDate>Fri, 06 Sep 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/09/06/go-doc-add-http-support/</guid><description>重拾精髓：go doc -http让离线包文档浏览更便捷 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 重拾精髓：...</description></item><item><title>通过Go示例理解函数式编程思维</title><link>https://tonybai.com/2024/08/11/understand-functional-programming-in-go/</link><pubDate>Sun, 11 Aug 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/08/11/understand-functional-programming-in-go/</guid><description>本文永久链接 – https://tonybai.com/2024/08/11/understand-functional-programming-in-go &amp;gt; 一个孩子要尝试10次、20次才肯接受一种新的食物，我们接受一种新的范式，大概不会比这个简单。– 郭晓刚 《函数式编程思维》译者 函数式编程(Functional Programming, 简称fp)是一种编程范式，与命令式编程(Impe...</description></item><item><title>Go语言编程指南翻译记：一本书，一支队伍，一段难忘的旅程</title><link>https://tonybai.com/2024/07/05/go-fundamentals-translation/</link><pubDate>Fri, 05 Jul 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/07/05/go-fundamentals-translation/</guid><description>Go语言编程指南翻译记：一本书，一支队伍，一段难忘的旅程 | Tony Bai =============== Tony Bai一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * 关于我 * 文章列表 Go语言编...</description></item><item><title>Go未用代码消除与可执行文件瘦身</title><link>https://tonybai.com/2024/05/05/dead-code-elimination-and-executable-file-slimming-in-go/</link><pubDate>Sun, 05 May 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/05/05/dead-code-elimination-and-executable-file-slimming-in-go/</guid><description>本文永久链接 – https://tonybai.com/2024/05/05/dead-code-elimination-and-executable-file-slimming-in-go 在日常编写Go代码时，我们会编写很多包，也会在编写的包中引入了各种依赖包。在大型Go工程中，这些直接依赖和间接依赖的包数目可能会有几十个甚至上百个。依赖包有大有小，但通常我们不会使用到依赖包中的所有导出函数...</description></item><item><title>Go语言反射编程指南</title><link>https://tonybai.com/2023/06/04/reflection-programming-guide-in-go/</link><pubDate>Sun, 04 Jun 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/06/04/reflection-programming-guide-in-go/</guid><description>本文永久链接 – https://tonybai.com/2023/06/04/reflection-programming-guide-in-go 反射是一种编程语言的高级特性，它允许程序在运行时检视自身的结构和行为。通过反射，程序可以动态地获取类型(type)与值(value)等信息，并对它们进行操作，诸如修改字段、调用方法等，这使得程序具有更大的灵活性和可扩展性。 不过，反射虽然具有强大的功...</description></item><item><title>聊聊Go语言的控制语句</title><link>https://tonybai.com/2023/05/27/control-flow-statement-in-go/</link><pubDate>Sat, 27 May 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/05/27/control-flow-statement-in-go/</guid><description>本文永久链接 – https://tonybai.com/2023/05/27/control-flow-statement-in-go 在高级编程语言中，控制流语句(control-flow statement)是一类用于控制程序执行流程的语句，以下简称为**控制语句**。它们可以根据条件或循环执行相应的代码块，或者跳转到指定位置执行代码。 常见的控制语句包括： * 条件语句：根据条件执行不同的...</description></item><item><title>Go：值与指针</title><link>https://tonybai.com/2023/05/05/go-value-and-pointer/</link><pubDate>Fri, 05 May 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/05/05/go-value-and-pointer/</guid><description>本文永久链接 – https://tonybai.com/2023/05/05/go-value-and-pointer 1\. 计算机中的值 ---------- 在百万年的演化历史中，人类对事物的属性进行了抽象，有了数量、精度、信息等概念的表示，对应的我们称之为整数、小数、文本文字等。计算机出现后，我们使用计算机对真实世界的问题进行建模，通过计算机的高效计算解决这些问题并输出答案。为了建模，计...</description></item><item><title>一文告诉你哪些map element类型支持就地更新</title><link>https://tonybai.com/2023/04/02/map-element-types-support-in-place-update/</link><pubDate>Sun, 02 Apr 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/04/02/map-element-types-support-in-place-update/</guid><description>本文永久链接 – https://tonybai.com/2023/04/02/map-element-types-support-in-place-update 年初，我代表团队和人民邮电出版社签订了翻译《Go Fundamentals》一书的合同，本月底便是四分之一进度的交稿时间点，近期闲时我们都在忙着做交叉review。 上周末我review小伙伴翻译的有关map类型的章节时，看到了书中对m...</description></item><item><title>十分钟入门Go语言</title><link>https://tonybai.com/2023/02/23/learn-go-in-10-min/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/02/23/learn-go-in-10-min/</guid><description>本文永久链接 – https://tonybai.com/2023/02/23/learn-go-in-10-min 本文旨在带大家快速入门Go语言，期望小伙伴们在花费十分钟左右通读全文后能对Go语言有一个初步的认知，为后续进一步深入学习Go奠定基础。 本文假设你完全没有接触过Go，你可能是一名精通其他编程语言的程序员，也可能是毫无编程经验、刚刚想转行为码农的热血青年。 编程简介 ---- 编程就...</description></item><item><title>Go类型系统：有何与众不同</title><link>https://tonybai.com/2022/12/18/go-type-system/</link><pubDate>Sun, 18 Dec 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/12/18/go-type-system/</guid><description>本文永久链接 – https://tonybai.com/2022/12/18/go-type-system Go是一门强类型的静态编程语言。使用Go编程，我们的每一行代码几乎都离不开**类型**。因此，深入学习Go，我们首先要对Go的类型系统(type system)有一个全面和深入的认知。Go类型系统可以给予我们一个全局整体的视角，以帮助我们更好地学习和理解Go语言中那些具体的与类型相关的内容...</description></item><item><title>当函数设计遇到切片</title><link>https://tonybai.com/2022/10/27/when-encountering-slice-during-function-design/</link><pubDate>Thu, 27 Oct 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/10/27/when-encountering-slice-during-function-design/</guid><description>本文永久链接 – https://tonybai.com/2022/10/27/when-encountering-slice-during-function-design 切片(slice)是Go语言中的一种重要的也是最常用的同构数据类型。在Go语言编码过程中，我们多数情况下会使用slice替代数组，一来是因为其动态可扩展，二来在多数场合传递slice的开销要比传递数组要小(这里有一些例外)。 ...</description></item><item><title>Go语言之道[译]</title><link>https://tonybai.com/2022/09/25/the-tao-of-go/</link><pubDate>Sun, 25 Sep 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/09/25/the-tao-of-go/</guid><description>本文永久链接 – https://tonybai.com/2022/09/25/the-tao-of-go 近期阅读了John Arundel的文章《The Tao of Go》，看完后我都有心去阅读一遍《道德经》了:)。作者将Go语言设计哲学与惯例与“道”学三宝有机的联系到一起，给了我不小的启发。这里译成中文，供大家参考。 * * * &amp;gt; 你可以让水牛去任何地方，只要它们想去 – 杰拉尔德・温伯...</description></item><item><title>GoCN社区Go读书会第二期：《Go语言精进之路》</title><link>https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master/</link><pubDate>Thu, 07 Jul 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master/</guid><description>本文永久链接 – https://tonybai.com/2022/07/07/gocn-community-go-book-club-issue2-go-programming-from-beginner-to-master 本文是2022年6月26日我在**GoCN社区的Go读书会第二期《Go语言精进之路》直播的文字稿**。本文对直播的内容做了重新整理与修订，供喜欢阅读文字的朋友们在收看直播后...</description></item><item><title>Go语言数据竞争检测与数据竞争模式</title><link>https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go/</link><pubDate>Tue, 21 Jun 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go/</guid><description>本文永久链接 – https://tonybai.com/2022/06/21/data-race-detection-and-pattern-in-go uber，就是那个早早退出中国打车市场的优步，是Go语言早期接纳者，也是Go技术栈的“重度用户”。uber内部的Go代码仓库有5000w+行Go代码，有2100个Go实现的独立服务，这样的Go应用规模在世界范围内估计也是Top3了吧。 uber...</description></item><item><title>Go 1.19新特性前瞻</title><link>https://tonybai.com/2022/06/12/go-1-19-foresight/</link><pubDate>Sun, 12 Jun 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/06/12/go-1-19-foresight/</guid><description>本文永久链接 – https://tonybai.com/2022/06/12/go-1-19-foresight 美国时间2022年5月7日，Go 1.19版本开发分支进入新特性冻结(freeze)阶段，即只能修Bug，不能再向Go 1.19版本中增加新特性了。由于上一个版本Go 1.18因引入泛型改动较大，推迟了一个月发布，这直接导致了Go 1.19版本的开发周期被缩短。 虽然开发周期少了近一...</description></item><item><title>评点2021-2022年上市的那些Go语言新书</title><link>https://tonybai.com/2022/06/01/reviewing-those-new-go-language-books-coming-out-in-2021-2022/</link><pubDate>Wed, 01 Jun 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/06/01/reviewing-those-new-go-language-books-coming-out-in-2021-2022/</guid><description>本文永久链接 – https://tonybai.com/2022/06/01/reviewing-those-new-go-language-books-coming-out-in-2021-2022 计算机科学与技术这个工业大类与传统工业类别相比还很“年轻”，并且由于历史原因，整个计算机科学与技术学科的奠基都是由欧美人完成的，因此但凡诞生一门新IT技术或新编程语言，我们首先参考的都是来自欧美的...</description></item><item><title>使用具名返回值巧妙解决泛型函数返回零值的问题</title><link>https://tonybai.com/2022/05/20/solving-problems-in-generic-function-implementation-using-named-return-values/</link><pubDate>Fri, 20 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/20/solving-problems-in-generic-function-implementation-using-named-return-values/</guid><description>本文永久链接 – https://tonybai.com/2022/05/20/solving-problems-in-generic-function-implementation-using-named-return-values Go语言泛型语法特性在Go 1.18版本落地后，不出所料，在github上看到大量的基础容器类型数据结构被用泛型重写。这种重写我觉得是很正常、很自然的，并且实现良好...</description></item><item><title>绞尽脑汁，帮你理解方法本质并选择正确的receiver类型</title><link>https://tonybai.com/2022/05/17/understand-the-nature-of-go-method-and-how-to-choose-the-correct-receiver-type/</link><pubDate>Tue, 17 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/17/understand-the-nature-of-go-method-and-how-to-choose-the-correct-receiver-type/</guid><description>本文永久链接 – https://tonybai.com/2022/05/17/understand-the-nature-of-go-method-and-how-to-choose-the-correct-receiver-type Go语言虽然不支持经典的面向对象语法元素，比如：类、对象、继承等，但Go语言也有方法（method）。和函数相比，Go语言中的方法在声明形式上仅仅多了一个参数，G...</description></item><item><title>Go程序员拥抱C语言简明指南</title><link>https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher/</link><pubDate>Mon, 16 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher/</guid><description>本文永久链接 – https://tonybai.com/2022/05/16/the-short-guide-of-embracing-c-lang-for-gopher 本文是为于航老师的极客时间专栏《深入C语言和程序运行原理》写的加餐文章《Tony Bai：Go程序员拥抱C语言简明指南》，这里分享给大家，尤其是那些想学习C语言的Gopher们。 * * * 你好，我是Tony Bai。 也许...</description></item><item><title>len(s)表达式的求值结果究竟是常量还是变量？我来告诉你</title><link>https://tonybai.com/2022/03/24/the-result-of-a-len-expression-is-constant-or-variable/</link><pubDate>Thu, 24 Mar 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/03/24/the-result-of-a-len-expression-is-constant-or-variable/</guid><description>本文永久链接 – https://tonybai.com/2022/03/24/the-result-of-a-len-expression-is-constant-or-variable **len**是Go预定义标识符，同时也是Go内置的预定义函数，通过go doc工具我们能查到len函数的doc如下： ``` $go doc builtin.len package builtin // im...</description></item><item><title>Ian Lance Taylor：Go泛型使用的一般准则</title><link>https://tonybai.com/2021/11/07/using-generics-in-go/</link><pubDate>Sun, 07 Nov 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/11/07/using-generics-in-go/</guid><description>本文永久链接 – https://tonybai.com/2021/11/07/using-generics-in-go 在近期Google Open Source Live的Go Day 2021环节，Go泛型的主要设计者Ian Lance Taylor做了Using Generics in Go的简短演讲(国内地址在这里)。这篇演讲的重点**不是即将于Go 1.18版本降临的Go泛型的语法细节...</description></item><item><title>Go 1.17新特性详解：使用基于寄存器的调用惯例</title><link>https://tonybai.com/2021/08/20/using-register-based-calling-convention-in-go-1-17/</link><pubDate>Fri, 20 Aug 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/08/20/using-register-based-calling-convention-in-go-1-17/</guid><description>本文永久链接 – https://tonybai.com/2021/08/20/using-register-based-calling-convention-in-go-1-17 除了Go语言特性与go module有重要变化之外，Go编译器与Go运行时也都有着优化与改进，这两方面的变化对Go程序的构建与运行影响巨大。在这个系列的最后一篇中，我们来看看编译器与运行时中那些值得关注的变化。 1. ...</description></item><item><title>Go中被闭包捕获的变量何时会被回收</title><link>https://tonybai.com/2021/08/09/when-variables-captured-by-closures-are-recycled-in-go/</link><pubDate>Mon, 09 Aug 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/08/09/when-variables-captured-by-closures-are-recycled-in-go/</guid><description>本文永久链接 – https://tonybai.com/2021/08/09/when-variables-captured-by-closures-are-recycled-in-go 1. Go函数闭包 Go语言原生提供了对闭包(closure)的支持。在Go语言中，闭包就是函数字面值。Go规范中是这样诠释闭包的： &amp;gt; 函数字面值(function literals)是闭包：它们可以引用其包...</description></item><item><title>一文告诉你如何用好uber开源的zap日志库</title><link>https://tonybai.com/2021/07/14/uber-zap-advanced-usage/</link><pubDate>Wed, 14 Jul 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/07/14/uber-zap-advanced-usage/</guid><description>本文永久链接 – https://tonybai.com/2021/07/14/uber-zap-advanced-usage 1. 引子 日志在后端系统中有着重要的地位，通过日志不仅可以直观看到程序的当前运行状态，更重要的是日志可以在程序发生问题时为开发人员提供线索。 在Go生态中，logrus可能是使用最多的Go日志库，它不仅提供结构化的日志，更重要的是与标准库log包在api层面兼容。在性能...</description></item><item><title>使用functrace辅助进行Go项目源码分析</title><link>https://tonybai.com/2021/06/04/go-source-analysis-with-functrace/</link><pubDate>Fri, 04 Jun 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/06/04/go-source-analysis-with-functrace/</guid><description>本文永久链接 – https://tonybai.com/2021/06/04/go-source-analysis-with-functrace 在《像跟踪分布式服务调用那样跟踪Go函数调用链》一文中，我们介绍了一种跟踪函数调用链的思路，并给出了一种实现functrace：https://github.com/bigwhite/functrace。这个小工具不仅仅是分享给大家的，我自己在工作和学...</description></item><item><title>Go函数调用链跟踪的一种实现思路</title><link>https://tonybai.com/2020/12/10/a-kind-of-thinking-about-how-to-trace-function-call-chain/</link><pubDate>Thu, 10 Dec 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/12/10/a-kind-of-thinking-about-how-to-trace-function-call-chain/</guid><description>这篇文章的初衷是想解答知乎上的一位知友提出的问题。没想到完成一种实现后，这个问题居然被删除了。那么既然实现了，就分享出来吧。问题的原文找不到了，问题大致是这样的： 一个程序中存在多个函数调用链都调用了函数D： A1 -&amp;gt; B1 &amp;gt; C1 -&amp;gt; D A2 -&amp;gt; B2 &amp;gt; C2 -&amp;gt; D A3 -&amp;gt; B3 -&amp;gt; C3 -&amp;gt; D ... ... 那么，如果某次函数D被调用时出现了问题，那么怎么知道这个D...</description></item><item><title>重度使用Go的“后遗症“，你有吗？</title><link>https://tonybai.com/2020/11/05/the-sequela-after-being-used-to-writting-code-in-go/</link><pubDate>Thu, 05 Nov 2020 00:00:00 +0800</pubDate><guid>https://tonybai.com/2020/11/05/the-sequela-after-being-used-to-writting-code-in-go/</guid><description>有一种未经证实的说法：**Go诞生于C++程序的漫长构建过程中**。如果C++编译很快，那么Robert Griesemer、Rob Pike和Ken Thompson这三位大佬也没有闲暇时间一起喝着咖啡并决定是时候设计一门新语言了。的确，Go语言诞生后，其简洁的语法、极速地构建、新颖的并发结构、体验优良的工具链以及完成度不低的标准库吸引了很多C/C++程序员转型成为Gopher并开始重度使用Go...</description></item><item><title>对一段有关Go Code Block和变量作用域的代码的简要分析</title><link>https://tonybai.com/2018/05/11/the-analysis-of-a-go-code-snippet-about-code-blocks-and-scope/</link><pubDate>Fri, 11 May 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/05/11/the-analysis-of-a-go-code-snippet-about-code-blocks-and-scope/</guid><description>近期，Go team的David CrawShaw在twitter上贴出了一段代码，如下： func main() { if a := 1; false { } else if b := 2; false { } else if c := 3; false { } else { println(a, b, c) } } David CrawShaw想表达的意图是gopher们很少在”else if...</description></item><item><title>defer函数参数求值简要分析</title><link>https://tonybai.com/2018/03/23/the-analysis-of-the-param-evaluation-of-defer-functions/</link><pubDate>Fri, 23 Mar 2018 00:00:00 +0800</pubDate><guid>https://tonybai.com/2018/03/23/the-analysis-of-the-param-evaluation-of-defer-functions/</guid><description>一. 引子 书接上文，在发表了《对一段Go语言代码输出结果的简要分析》一文之后，原问题提出者又有了新问题，这是一个典型Gopher学习Go的历程，想必很多Gopher们，包括我自己都遇到过的。我们先来看看这段代码(来自原问题提出者)： // https://play.golang.org/p/dOUFNj96EIQ package main import &amp;#34;fmt&amp;#34; func main() { v...</description></item><item><title>一个有关Golang变量作用域的坑</title><link>https://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/</link><pubDate>Tue, 13 Jan 2015 00:00:00 +0800</pubDate><guid>https://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/</guid><description>临近下班前编写和调试一段Golang代码，但运行结果始终与期望不符，怪异的很，下班前依旧无果。代码Demo如下： //testpointer.go package main import (         &amp;#34;fmt&amp;#34; ) var p \*int func foo() (\*int, error) {         var i int = 5         return &amp;amp;i, nil } f...</description></item><item><title>《Understanding and Using C Pointers》要点先睹为快</title><link>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/</link><pubDate>Tue, 28 May 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/</guid><description>_如果你问十个C程序员：你觉得C语言的核心是什么？这十个程序员都会回答：指针。_ 指针具备成为C语言核心的两个关键要素：**强大**与**争议**。 \* **指针的强大**源自于其天生与机器内存模型的适配。使用指针让代码紧凑，并可获得仅次于汇编代码的执行效率；使用指针可以让C程 序员毫不费力地尽情操纵着内存中的每个byte甚至是bit；使用指针可以为C程序员提供无与伦比的操作灵活性。总之，在C语...</description></item><item><title>C程序员驯服Common Lisp – 函数</title><link>https://tonybai.com/2011/09/23/c-programers-tame-common-lisp-series-functions/</link><pubDate>Fri, 23 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/23/c-programers-tame-common-lisp-series-functions/</guid><description>Common Lisp是函数式编程语言，其基本组成单元自然是函数。对Common Lisp函数的理解也是学习Common Lisp语言的关键。另外与C语言以内存单元修改为主要编程方法不同，Common Lisp的主要编程方法是将函数应用于参数。这里我们分别用两种范式风格实现同一个函数，该函数用于取得第n个fibonacci数（n从0开始）： ;; 命令式风格 (defun imperative-f...</description></item><item><title>C程序员驯服Common Lisp – 变量</title><link>https://tonybai.com/2011/09/20/c-programers-tame-common-lisp-series-variables/</link><pubDate>Tue, 20 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/20/c-programers-tame-common-lisp-series-variables/</guid><description>变量是C语言中最常用的、不可或缺的语言元素。C语言是命令式编程语言（imperative programming language），其基本编程方法是基于对内存单元的修改，而变量又恰是对内存单元的抽象表示，比如：&amp;#34;int a = 0xff&amp;#34;这行语句告诉我们在内存中有一块大小为4个字节的区域，该区域可以通过a这个变量直接访问，该区域初始时存储的值为0xff。由此看来C语言的主要操作就是变量操作。 C...</description></item><item><title>C程序员驯服Common Lisp – 控制结构</title><link>https://tonybai.com/2011/09/14/c-programers-tame-common-lisp-series-control-structure/</link><pubDate>Wed, 14 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/14/c-programers-tame-common-lisp-series-control-structure/</guid><description>光有表达式，我们依旧无法写出实用的程序，我们还缺少控制结构(Control Structures)。 C语言主要有三种控制结构：顺序结构、条件分支结构和循环结构。Common Lisp 也实现了类似的控制结构，我们逐一来看。 一、顺序结构 顾名思义，顺序结构中的语句或表达式是按其位置的先后顺序依次执行的，这也是最简单也最容易理解的一种结构。在C语言中，绝大多数代码块(code block)中的代码...</description></item><item><title>C程序员驯服Common Lisp – 表达式</title><link>https://tonybai.com/2011/09/02/c-programers-tame-common-lisp-series-expressions/</link><pubDate>Fri, 02 Sep 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/09/02/c-programers-tame-common-lisp-series-expressions/</guid><description>Common Lisp程序由一组表达式构成。在&amp;#34;入门&amp;#34;一文中我提到过：Common Lisp使用S-expressions作为表达式(Expressions)的基本语法格式。S-expressions由原子(atoms)和S-expressions列表组成，或者说原子和列表(List)是组成S-expression的基本元素。复杂的源程序都是由简单的表达式组成的，我们在学习编写实用的Common ...</description></item><item><title>C程序员驯服Common Lisp – 入门</title><link>https://tonybai.com/2011/08/30/c-programers-tame-common-lisp-series-introduction/</link><pubDate>Tue, 30 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/30/c-programers-tame-common-lisp-series-introduction/</guid><description>毫无疑问，Common Lisp是一门庞大且复杂的语言，学习曲线并不平坦。对于一个从未接触过函数式语言、交互式语言以及动态类型语言的C程序员来说，学习Common Lisp显然是一个很大的挑战。 也许有人会问：&amp;#34;C语言已经无所不能了，为何还要学习Common Lisp？&amp;#34;在这里我不想说太多冠冕堂皇的话，至少对我而言，理由有三： 一是好奇，在C语言的世界里待得久了，总想探出头来吸几口新鲜空气，这次我...</description></item><item><title>Common Lisp初学点滴</title><link>https://tonybai.com/2011/08/05/some-experience-of-common-lisp-beginner/</link><pubDate>Fri, 05 Aug 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/08/05/some-experience-of-common-lisp-beginner/</guid><description>Common Lisp是一门Interactive语言，比较容易上手。无论你是用CLISP，SBCL还是Clozure CL，你都可以很快地写出一个&amp;#34;Hello, World&amp;#34;程序出来。不过千万不要因此低估了Common Lisp，前人的经验表明：Common Lisp是门庞大且复杂的语言，其学习曲线可并不低。要想真正掌握它，需要你有持续的热情、足够的耐心和不断的练习。我接触Common Lisp...</description></item><item><title>Hello，Common Lisp</title><link>https://tonybai.com/2011/06/21/hello-common-lisp/</link><pubDate>Tue, 21 Jun 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/06/21/hello-common-lisp/</guid><description>Paul Graham不愧被誉为Lisp)的超级推手，他的煽动力真的是很强悍。这不才刚刚看完一遍他编写的《黑客与画家》后，我就决定将Common Lisp作为今年计划学习的那门新语言，而且从现在就开始。 去年曾囫囵吞枣般的学习过Haskell，一门通用且庞大的纯函数式编程语言。在惊叹于Haskell如此与众不同且功能强大的同时，也为Haskell Monad那魔鬼般的蹩脚语法所苦恼，而Monad的...</description></item><item><title>应对库接口原型变更</title><link>https://tonybai.com/2011/01/24/response-for-the-interface-prototype-change/</link><pubDate>Mon, 24 Jan 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/01/24/response-for-the-interface-prototype-change/</guid><description>也许你经常遇到这类情况：你在代码里使用了别人提供的第三方库，当库升级为新版本后，你的代码在编译时无法通过，提示接口原型错误，经查发现原来是该第三方库提供的某接口的原型发生了变化，比如原接口被删除、增加了参数、参数减少了、修改了参数类型以及返回类型发生变化了等等。你也许会不由自主的大骂一句：F\*\*k。 我们换位思考一下，假如你是某个库的Owner，当你遇到需要修改接口原型的情形时，你应该如何去做...</description></item><item><title>《Programming in Haskell》中文版翻译项目</title><link>https://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/</link><pubDate>Sun, 14 Nov 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/</guid><description>_&amp;#34;A language that doesn&amp;#39;t affect the way you think about programming， is not worth knowing&amp;#34;._ — Alan Perlis(ACM 第一任主席，图灵奖得主，1922-1990) 《程序员修炼之道》这本书建议程序员每年应至少学习一门新的语言，以拓宽思维，避免墨守成规。今年我选择了函数式编程语言Haskell。...</description></item><item><title>经典设计原则背后的本质</title><link>https://tonybai.com/2010/09/17/the-nature-of-some-classical-design-rules/</link><pubDate>Fri, 17 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/17/the-nature-of-some-classical-design-rules/</guid><description>近一段时间重读了一些经典书籍，诸如《敏捷软件开发：原则、模式与实践》、 《程序员修炼之道》、《Unix编程艺术》等。这些书中关于如何衡量或评价一个类或函数设计好坏的几个原则(Principle)让人印象深刻。《敏捷软件开发》中谈到了SRP、OCP、DIP; 程序员修炼之道则以DRY、“正交性”为话题展开;《Unix编程艺术》围绕紧凑性、SPOT、分离等阐述作者立场。这么多经典原则，如何学习把握？我...</description></item><item><title>一次函数设计讨论</title><link>https://tonybai.com/2010/09/02/an-discussion-on-function-design/</link><pubDate>Thu, 02 Sep 2010 00:00:00 +0800</pubDate><guid>https://tonybai.com/2010/09/02/an-discussion-on-function-design/</guid><description>近期在考虑对底层函数库进行一些重构，今天下午花了两个小时考量现有的函数库的接口设计，发现目前函数库的实现存在着一个普遍的问题：与特定的内存分配实现耦合的太紧。 我们的应用是多进程结构的，并使用了共享内存这种最快捷的IPC机制，鉴于此很多同事在实现一些数据结构或者算法时可能只考虑到了我们常见的应用场景-多进程共享，而对非共享内存分配的情况考虑不足。那如何将目前某些库函数实现与内存分配之间的强耦合解开...</description></item><item><title>C++咬文嚼字-'Functions'</title><link>https://tonybai.com/2007/03/13/cpp-weigh-every-word-series-functions/</link><pubDate>Tue, 13 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/13/cpp-weigh-every-word-series-functions/</guid><description>关于Functions，Bjarne Stroustrup在&amp;#39;The C++ Programming Language&amp;#39;一书中是这么开篇的：&amp;#39;The typical way of getting something done in a C++ program is to call a function to do it.&amp;#39;；另外他还阐述了一个使用Functions的原则：&amp;#39;A function c...</description></item></channel></rss>