<?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/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link><description>Recent content in 数据结构 on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Tue, 16 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么说“编译通过，就能运行”？Google 专家 Alice 揭秘 Rust 的工程美学与底层逻辑</title><link>https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic/</guid><description>本文永久链接 – https://tonybai.com/2026/06/16/why-if-it-compiles-it-runs-rust-engineering-aesthetics-and-logic 大家好，我是Tony Bai。 在软件工程界，有一句流传甚广、近乎玄学的名言：“如果你的 Rust 代码通过了编译，那么它就已经可以正确运行了。” 对于被 Java 的空指针异常（NullP...</description></item><item><title>十年难题终获突破：揭秘 Go 1.27 接口逃逸分析优化</title><link>https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough/</link><pubDate>Fri, 22 May 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough/</guid><description>本文永久链接 – https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough 大家好，我是Tony Bai。 在日常的 Go 语言开发中，有这样一段极其普通、普通到闭着眼睛都能敲出来的代码： ``` val := 1000 fmt.Sprintf(&amp;#34;Result: %d&amp;#34;, v...</description></item><item><title>TypeScript 编译器 Go 重写版提速 10 倍：微软团队深度揭秘幕后工程细节</title><link>https://tonybai.com/2026/01/27/typescript-compiler-go-rewrite-10x-speed-microsoft-details/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0800</pubDate><guid>https://tonybai.com/2026/01/27/typescript-compiler-go-rewrite-10x-speed-microsoft-details/</guid><description>本文永久链接 – https://tonybai.com/2026/01/27/typescript-compiler-go-rewrite-10x-speed-microsoft-details 大家好，我是Tony Bai。 “JavaScript 是一门很棒的语言，但它并不是为了编写编译器而设计的。” 备受瞩目的 TypeScript 编译器 Go 重写版（代号 TypeScript 7.0...</description></item><item><title>Go 泛型再进化：移除类型参数的循环引用限制</title><link>https://tonybai.com/2025/11/19/proposal-remove-cycle-restriction-for-type-parameters/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/19/proposal-remove-cycle-restriction-for-type-parameters/</guid><description>本文永久链接 – https://tonybai.com/2025/11/19/proposal-remove-cycle-restriction-for-type-parameters 大家好，我是Tony Bai。 自 Go 1.18 引入泛型以来，Gopher 们一直在探索其能力的边界。然而，在这片新大陆上，一直存在着一个由语言规范施加的限制，它禁止了一种强大而富有表达力的泛型模式的实现。 ...</description></item><item><title>来自 Go 创始人的忠告：这五条关于“复杂性”的法则，比算法更重要</title><link>https://tonybai.com/2025/11/10/rob-pike-on-complexity/</link><pubDate>Mon, 10 Nov 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/11/10/rob-pike-on-complexity/</guid><description>本文永久链接 – https://tonybai.com/2025/11/10/rob-pike-on-complexity 大家好，我是Tony Bai。 在软件工程的殿堂里，我们常常将算法和数据结构奉为圭臬。我们痴迷于时间复杂度的优化，热衷于讨论各种精巧的数据结构。然而，Go 语言的联合创始人 Rob Pike 早在其1989年的一篇C 语言编程笔记中，就为我们留下了一份更根本的“忠告”。这份...</description></item><item><title>从《凡人修仙传》到《三体》：顶尖程序员的“降维打击”与“法则”之力</title><link>https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power/</link><pubDate>Fri, 24 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power/</guid><description>本文永久链接 – https://tonybai.com/2025/10/24/from-fanren-to-three-body-top-programmers-power 大家好，我是Tony Bai。 在上篇文章中，我们论道了程序员的修仙境界。但一个更深层的问题随之而来：决定一个修士（程序员）最终高度的，究竟是什么？是掌握了更多华丽的“法术”（框架/工具），还是洞悉了其背后的“天地法则”（底...</description></item><item><title>Go 作为第一门编程语言：天才之选还是糟糕开端？</title><link>https://tonybai.com/2025/10/11/go-is-a-good-first-programming-language/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/10/11/go-is-a-good-first-programming-language/</guid><description>Go 作为第一门编程语言：天才之选还是糟糕开端？ - Tony Bai Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶课FAQ * 关于我 * 我的技术专栏 * 文章列表 Go...</description></item><item><title>Go 1.24用户报告：Datadog如何借助 Swiss Tables版map节省数百 GB 内存？</title><link>https://tonybai.com/2025/07/22/go-swiss-table-map-user-report/</link><pubDate>Tue, 22 Jul 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/07/22/go-swiss-table-map-user-report/</guid><description>本文永久链接 – https://tonybai.com/2025/07/22/go-swiss-table-map-user-report 大家好，我是Tony Bai。 Datadog 的故事始于一次对Go 1.24内存回归问题的追踪。在与 Go 社区协作修复了该问题后，他们在部署修复版本的过程中，观察到了一个意料之外的现象：在高流量环境中，内存使用不仅恢复了正常，甚至**大幅下降**。一个名...</description></item><item><title>Go unique包：突破字符串局限的通用值Interning技术实现</title><link>https://tonybai.com/2024/09/18/understand-go-unique-package-by-example/</link><pubDate>Wed, 18 Sep 2024 00:00:00 +0800</pubDate><guid>https://tonybai.com/2024/09/18/understand-go-unique-package-by-example/</guid><description>本文永久链接 – https://tonybai.com/2024/09/18/understand-go-unique-package-by-example Go的1.23版本中引入了一个新的标准库包unique，为Go开发者带来了高效的值interning能力)。这种能力不仅适用于字符串类型值，还可应用于任何可比较(comparable)类型的值。 本文将简要探讨interning技术及其在G...</description></item><item><title>Go语言开发者的Apache Arrow使用指南：读写Parquet文件</title><link>https://tonybai.com/2023/07/31/a-guide-of-using-apache-arrow-for-gopher-part6/</link><pubDate>Mon, 31 Jul 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/07/31/a-guide-of-using-apache-arrow-for-gopher-part6/</guid><description>本文永久链接 – https://tonybai.com/2023/07/31/a-guide-of-using-apache-arrow-for-gopher-part6 Apache Arrow是一种开放的、与语言无关的列式内存格式，在本系列文章的前几篇中，我们都聚焦于内存表示与内存操作。 但对于一个数据库系统或大数据分析平台来说，数据不能也无法一直放在内存中，虽说目前内存很大也足够便宜了，但...</description></item><item><title>Go语言开发者的Apache Arrow使用指南：扩展compute包</title><link>https://tonybai.com/2023/07/22/a-guide-of-using-apache-arrow-for-gopher-part5/</link><pubDate>Sat, 22 Jul 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/07/22/a-guide-of-using-apache-arrow-for-gopher-part5/</guid><description>本文永久链接 – https://tonybai.com/2023/07/22/a-guide-of-using-apache-arrow-for-gopher-part5 在本系列文章的第4篇《Go语言开发者的Apache Arrow使用指南：数据操作》中我们遇到了**大麻烦**：Go的Arrow实现居然不支持像max、min、sum这样的简单聚合计算函数:(，分组聚合(grouped aggr...</description></item><item><title>Go语言开发者的Apache Arrow使用指南：数据操作</title><link>https://tonybai.com/2023/07/13/a-guide-of-using-apache-arrow-for-gopher-part4/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/07/13/a-guide-of-using-apache-arrow-for-gopher-part4/</guid><description>本文永久链接 – https://tonybai.com/2023/07/13/a-guide-of-using-apache-arrow-for-gopher-part4 在前面的Arrow系列文章中，我们介绍了Arrow的基础数据类型以及高级数据类型，这让我们具备了在内存中建立起一个immutable数据集的能力。但这并非我们的目标，我们最终是要对建立起来的数据集进行查询和分析等操作(mani...</description></item><item><title>Go语言开发者的Apache Arrow使用指南：高级数据结构</title><link>https://tonybai.com/2023/07/08/a-guide-of-using-apache-arrow-for-gopher-part3/</link><pubDate>Sat, 08 Jul 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/07/08/a-guide-of-using-apache-arrow-for-gopher-part3/</guid><description>本文永久链接 – https://tonybai.com/2023/07/08/a-guide-of-using-apache-arrow-for-gopher-part3 经过对前面两篇文章《Arrow数据类型》和《Arrow Go实现的内存管理》的学习，我们知道了各种Arrow array type以及它们在内存中的layout，我们了解了Go arrow实现在内存管理上的一些机制和使用原则。...</description></item><item><title>手把手教你使用ANTLR和Go实现一门DSL语言（第五部分）：错误处理</title><link>https://tonybai.com/2022/05/30/an-example-of-implement-dsl-using-antlr-and-go-part5/</link><pubDate>Mon, 30 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/30/an-example-of-implement-dsl-using-antlr-and-go-part5/</guid><description>本文永久链接 – https://tonybai.com/2022/05/30/an-example-of-implement-dsl-using-antlr-and-go-part5 无论是端应用还是云应用，要上生产环境，有一件事必须要做好，那就是**错误处理**。在本系列前面的文章中，我们设计了文法与语法、建立并验证了语义模型，但我们没有特别关注错误处理。在这一篇中，我们就来补上这个环节。 D...</description></item><item><title>手把手教你使用ANTLR和Go实现一门DSL语言（第四部分）：组装语义模型并测试DSL</title><link>https://tonybai.com/2022/05/28/an-example-of-implement-dsl-using-antlr-and-go-part4/</link><pubDate>Sat, 28 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/28/an-example-of-implement-dsl-using-antlr-and-go-part4/</guid><description>本文永久链接 – https://tonybai.com/2022/05/28/an-example-of-implement-dsl-using-antlr-and-go-part4 在上一篇文章中，我们为DSL建立了完整的语义模型，我们距离DSL的语法示例真正run起来还差最后一步，那就是基于语法树提取信息(逆波兰式)、组装语义模型，在加载语义模型并实例化各个规则处理器(processor)后...</description></item><item><title>手把手教你使用ANTLR和Go实现一门DSL语言（第三部分）：建立和验证语义模型</title><link>https://tonybai.com/2022/05/27/an-example-of-implement-dsl-using-antlr-and-go-part3/</link><pubDate>Fri, 27 May 2022 00:00:00 +0800</pubDate><guid>https://tonybai.com/2022/05/27/an-example-of-implement-dsl-using-antlr-and-go-part3/</guid><description>本文永久链接 – https://tonybai.com/2022/05/27/an-example-of-implement-dsl-using-antlr-and-go-part3 在前面的系列文章中，我们为气象学家们设计了一门名为**Tdat**的DSL，使用ANTLR的文法规则编写了Tdat的文法，基于该文法生成了Tdat的语法解析器代码并初步验证了文法的正确性，Tdat可以成功将我们编写...</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>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实现可用select监听的队列</title><link>https://tonybai.com/2021/03/26/implement-a-queue-with-select-listener-in-go/</link><pubDate>Fri, 26 Mar 2021 00:00:00 +0800</pubDate><guid>https://tonybai.com/2021/03/26/implement-a-queue-with-select-listener-in-go/</guid><description>1\. 背景与选型 和《基于Redis Cluster的分布式锁实现以互斥方式操作共享资源》一文一样，今天要说的Go队列方案也是有一定项目背景的。 5G消息方兴未艾！前一段时间从事了一段时间5G消息网关的研发，但凡涉及类似消息业务的网关，我们一般都离不开**队列**这种数据结构的支持。这个5G消息网关项目采用的是Go技术栈开发，那么我们应该如何为它选择一个**与业务模型匹配且性能不差**的实现呢？...</description></item><item><title>程序 – 程序员的avatar</title><link>https://tonybai.com/2013/10/08/program-the-avatar-of-programmers/</link><pubDate>Tue, 08 Oct 2013 00:00:00 +0800</pubDate><guid>https://tonybai.com/2013/10/08/program-the-avatar-of-programmers/</guid><description>程序是什么？ 大师们曾给过这样的诠释：        _程序 = 数据 + 指令     程序 = 数据结构 + 算法_ 对此我也表示十分认同。但感觉这些观点更多是从机器运行模型或逻辑抽象的角度看待程序的，是左脑的产物。我的右脑告诉我：_**程序是程序员的avatar**_（化身）。这个隐喻式的诠释会让“程序”更有温度，并有些许人性的色彩。 计算机（CPU、主板、内存、磁盘、网络）为程序提供了一个...</description></item><item><title>偿还N年前的一笔技术债</title><link>https://tonybai.com/2011/07/21/pay-for-a-tech-debt-of-several-year-ago/</link><pubDate>Thu, 21 Jul 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/07/21/pay-for-a-tech-debt-of-several-year-ago/</guid><description>记得刚来公司时曾参与过一个项目，项目中用到了部门基础库中的一个B+树接口。不过在程序调试过程中我们发现可执行程序总是dump core（在sparc solaris上），经初步分析，断定问题就出在B+树接口处，但一时又找不到问题原因。还好这个B+树的实现者就坐在我的旁边。他分析后告诉我：这个B+树接口要求用户自定义的索引结构体的size应该为4的整数倍。按照他的说法，我为结构体打了padding，...</description></item><item><title>使用正确的算法和数据结构</title><link>https://tonybai.com/2011/04/19/use-the-right-algorithm-and-data-structure/</link><pubDate>Tue, 19 Apr 2011 00:00:00 +0800</pubDate><guid>https://tonybai.com/2011/04/19/use-the-right-algorithm-and-data-structure/</guid><description>本文翻译自”Use the Right Algorithm and Data Structure“，来自于《程序员应该知道的97件事》一书中的某个章节。 _一家拥有多个分行的大银行抱怨说他们为出纳员新买的计算机运行得太慢了。这件事儿发生在电子银行以及ATM机使用普及程度远不及现在的那个年代。人们更多的是亲自到银行办理业务，这些运行超慢的计算机使得大家排起了长队。因此，这家银行威胁计算机供货商要结束...</description></item><item><title>不完备库接口带来的隐患</title><link>https://tonybai.com/2006/09/09/hidden-danger-introduced-by-uncompleted-interface/</link><pubDate>Sat, 09 Sep 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/09/09/hidden-danger-introduced-by-uncompleted-interface/</guid><description>最近自己曾经辛苦耕耘过的两个项目同时上线，相关问题也就逐渐暴露出来。工作这两年多时间以后，使我有这样感觉：’测试永远都是不完备的’，有些问题只能在商用过程中发现，呵呵，明确一点啊我不是搞测试的:) 在解决问题过程中的感悟往往是最深刻的，解决问题的过程往往真的像是警察在侦破案件，往往一点点罪犯留下的蛛丝马迹就会让神探们找到线索，并迅速破案。 最近两天一直在一个bug上煎熬着，终于于昨天发现蛛丝马迹并...</description></item><item><title>APR源代码分析-环篇</title><link>https://tonybai.com/2005/11/03/apr-ring/</link><pubDate>Thu, 03 Nov 2005 00:00:00 +0800</pubDate><guid>https://tonybai.com/2005/11/03/apr-ring/</guid><description>APR中少见对数据结构的封装，好像唯一例外的就是其对循环链表，即环(RING)的封装。 在大学的时候学的不是计算机专业，但大三的时候我所学的专业曾开过一门好像叫“计算机软件开发基础”的课，使用的是清华的一本教材，课程的内容包括数据结构。说实话听过几节课，那个老师讲的还不错，只是由于课程目标所限，没讲那么深罢了。当然我接触数据结构要早于这门课的开课时间。早在大一下学期就开始到计算机专业旁听“数据结构...</description></item></channel></rss>