<?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>Build on Tony Bai</title><link>https://tonybai.com/tags/build/</link><description>Recent content in Build on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Sat, 31 May 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/build/index.xml" rel="self" type="application/rss+xml"/><item><title>“这代码迟早出事！”——复盘线上问题：六个让你头痛的Go编码坏味道</title><link>https://tonybai.com/2025/05/31/six-smells-in-go/</link><pubDate>Sat, 31 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/31/six-smells-in-go/</guid><description>本文永久链接 – https://tonybai.com/2025/05/31/six-smells-in-go 大家好，我是Tony Bai。 在日常的代码审查 (Code Review) 和线上问题复盘中，我经常会遇到一些看似不起眼，却可能埋下巨大隐患的 Go 代码问题。这些“编码坏味道”轻则导致逻辑混乱、性能下降，重则引发数据不一致、系统崩溃，甚至让团队成员在深夜被告警声惊醒，苦不堪言。 今...</description></item><item><title>当Gopher拥有了“Go语言女友”：一张图带你读懂Go的那些“可爱”特性</title><link>https://tonybai.com/2025/05/30/gopher-girlfriend/</link><pubDate>Fri, 30 May 2025 00:00:00 +0800</pubDate><guid>https://tonybai.com/2025/05/30/gopher-girlfriend/</guid><description>当Gopher拥有了“Go语言女友”：一张图带你读懂Go的那些“可爱”特性 - Tony Bai =============== Tony Bai 一个程序员的心路历程 * Google Go语言编码风格规范 * Google Go语言编码风格规范：指南篇 * Google Go语言编码风格规范：决定篇 * Google Go语言编码风格规范：最佳实践篇 * Go语言第一课FAQ * Go语言进阶...</description></item><item><title>Go 1.20中值得关注的几个变化</title><link>https://tonybai.com/2023/02/08/some-changes-in-go-1-20/</link><pubDate>Wed, 08 Feb 2023 00:00:00 +0800</pubDate><guid>https://tonybai.com/2023/02/08/some-changes-in-go-1-20/</guid><description>本文永久链接 – https://tonybai.com/2023/02/08/some-changes-in-go-1-20 美国时间2023年2月1日，唯一尚未退休的Go语言之父Robert Griesemer代表Go核心开发团队在Go官博撰文正式发布了Go 1.20版本。就像Russ Cox在2022 GopherCon大会所说的那样：**Go2永不会到来，Go 1.x.y将无限延续**！ ...</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程序员拥抱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>理解Docker的多阶段镜像构建</title><link>https://tonybai.com/2017/11/11/multi-stage-image-build-in-docker/</link><pubDate>Sat, 11 Nov 2017 00:00:00 +0800</pubDate><guid>https://tonybai.com/2017/11/11/multi-stage-image-build-in-docker/</guid><description>Docker技术从2013年诞生到目前已经4年有余了。对于已经接纳和使用Docker技术)在日常开发工作中的开发者而言，构建Docker镜像已经是家常便饭。但这是否意味着Docker的image构建机制已经相对完美了呢？不是的，Docker官方依旧在持续优化镜像构建机制。这不，从今年发布的Docker 17.05版本起，Docker开始支持容器镜像的多阶段构建(multi-stage build)...</description></item><item><title>Golang跨平台交叉编译</title><link>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0800</pubDate><guid>https://tonybai.com/2014/10/20/cross-compilation-with-golang/</guid><description>近期在某本书上看到Go跨平台交叉编译的强大功能，于是想自己测试一下。以下记录了测试过程以及一些结论，希望能给大家带来帮助。 我的Linux环境如下： uname -a Linux ubuntu-Server-14 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86\_64 x86\_64 x86\_64 GNU/Lin...</description></item><item><title>也谈C应用安装包制作与部署</title><link>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</link><pubDate>Wed, 01 Feb 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/02/01/also-talk-about-c-app-install-package-making-and-deploying/</guid><description>虽然部门一直在做C应用，但这么多年来，在C应用的安装包制作以及部署方面做得还是很初级，可以说还没有达到规范的程度。各个产品线的C应用安装包种类多样，水平参差不齐：有些产品的源码包即是安装包，把源码包拿到生产环境下编译后使用；有的项目则将编译好的目标文件(.o)以及第三方库放在安装包中，在生产环境下重新链接生成可执行文件；有的组则稍微专业一些，安装包中放的是编译好的可执行文件，但在目标主机上安装和执...</description></item><item><title>也谈C语言应用构建</title><link>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</link><pubDate>Tue, 17 Jan 2012 00:00:00 +0800</pubDate><guid>https://tonybai.com/2012/01/17/also-talk-about-building-c-app/</guid><description>构建是软件开发过程中最常见的活动之一，也是很容易被忽视的环节。规范以及高效的构建对软件开发过程而言是大有裨益的。C语言并非一门年轻的语言，其历史已甚为悠久了(相对于还年轻的IT领域^\_^)。从C语言诞生以来，市面上存在的C语言应用何止千千万万。这些C应用的源码组织形式种类万千，从最简单的单个源文件，到复杂的诸如Apache httpd server这样庞大的Project。不过无论这些C应用的源...</description></item><item><title>共享库中的符号链接</title><link>https://tonybai.com/2008/02/03/symbol-linkage-in-shared-library/</link><pubDate>Sun, 03 Feb 2008 00:00:00 +0800</pubDate><guid>https://tonybai.com/2008/02/03/symbol-linkage-in-shared-library/</guid><description>清晨，部门新来的一位小兄弟打来求助电话，说是系统启动的时候出现类似：&amp;#34;ld.so.1: testmain: 致命的: 重定位错误: 文件./libtestshared.so: 符号static\_add: 参照的符号没有找到&amp;#34;的错误。这个系统是05年开发的一个复用度很高的自研产品，后续项目只需在其基础上做少量二次开发工作即可满足新功能的要求。为了做到一定的通用性，我们使用了类似插件的框架，这样系统...</description></item><item><title>也谈’SIGBUS和SIGSEGV’</title><link>https://tonybai.com/2007/12/19/also-talk-about-sigbus-and-sigsegv/</link><pubDate>Wed, 19 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/19/also-talk-about-sigbus-and-sigsegv/</guid><description>SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信号。内存问题一直是最令我们头疼的事情，弄清楚两个信号的发生缘由对我们很好的理解程序的运行是大有裨益的。 我们来看两段程序： //testsigsegv.c int main() {         char \*pc = (char\*)0×00001111;         \*pc = 17; } //testsigbu...</description></item><item><title>一个很有意思的Bug</title><link>https://tonybai.com/2007/12/18/an-funny-bug/</link><pubDate>Tue, 18 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/18/an-funny-bug/</guid><description>这个Bug源于昨天凌晨的一次版本升级失败。睡了一大觉后，下午回到公司，重现了这个问题并找到了原因，发现这的确是一个&amp;#39;很有意思的Bug&amp;#39;。 系统在从数据库初始化过程中遇到了问题：在读取数据库数据时，提示ORA-24373错误。手册上对ORA-24373的解释是这样的： ORA-24373: invalid length specified for statement Cause: The lengt...</description></item><item><title>'符号连接'那些事儿</title><link>https://tonybai.com/2007/12/08/those-things-about-symbol-linkage/</link><pubDate>Sat, 08 Dec 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/12/08/those-things-about-symbol-linkage/</guid><description>我们在编译自己开发的程序或者一些开源软件的时候，常常遇到类似如下的编译器错误信息： 未定义 文件中的 符号 在文件中 i /var/tmp//ccU4sj6I.o func /var/tmp//ccU4sj6I.o ld: 致命的: 符号参照错误. 没有输出被写入a.out collect2: ld returned 1 exit status 或&amp;#34;undefined reference to &amp;#39;...</description></item><item><title>成功Build ACE</title><link>https://tonybai.com/2007/06/14/build-ace-successfully/</link><pubDate>Thu, 14 Jun 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/06/14/build-ace-successfully/</guid><description>近期公司实行新的绩效考核机制，我的考核目标中就有一项叫做：&amp;#34;成功使用新技术、框架、思路等至少3个&amp;#34;，呵呵，先不论绩效考核机制是否合理，既然已经这样了那就需要去适应。一直在做Network Application，早就知道ACE在业界中的名气，这回有理由找个时间好好挖掘一下ACE的思路，也为我的绩效目标增色啊^\_^。 以上只是开个玩笑罢了。上周末去书店看到电子工业出版社再次出版的&amp;#39;C++网络编程卷...</description></item><item><title>C++咬文嚼字-'Pointer Trick'</title><link>https://tonybai.com/2007/05/22/cpp-weigh-every-word-series-pointer-trick/</link><pubDate>Tue, 22 May 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/05/22/cpp-weigh-every-word-series-pointer-trick/</guid><description>晚上饭后抽空看了看如何实现一个内存管理器，涉及内存操作必定少不了指针，恰研究到offsetof这个operator，也看了它的实现，顿有所悟。 先看一段代码： struct Foo {         int     a;         char\*   p;         char    b; }; Foo\* p1 = reinterpret\_cast(0); Foo\* p2 = 0;...</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><item><title>C++咬文嚼字-'Evil cast'</title><link>https://tonybai.com/2007/03/12/cpp-weigh-every-word-series-evil-cast/</link><pubDate>Mon, 12 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/12/cpp-weigh-every-word-series-evil-cast/</guid><description>Cast也被称为&amp;#34;Explicit Type Conversion&amp;#34;，即显式类型转换，在传统C中强制转型(cast)只有一种语法形式(T)e。Bjarne Stroustrup在&amp;#39;The Design and Evolution of C++&amp;#39;(以后称作D&amp;amp;E)一书的14.3小节开始就说了&amp;#39;无论是从语法还是从语义上, Cast都是C++里最难看的特征之一&amp;#39;，所以他要为cast提供A New Cas...</description></item><item><title>C++咬文嚼字-'0 or NULL'</title><link>https://tonybai.com/2007/03/10/cpp-weigh-every-word-series-0-or-null/</link><pubDate>Sat, 10 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/10/cpp-weigh-every-word-series-0-or-null/</guid><description>C程序员和C++程序员在声明空指针时做法常常是不相同的。 C程序员常常如下做： int \*ptr = NULL; C++程序员则是听从Bjarne Stroustrup或者其他C++大师的教诲，坚定地如下做： int \*ptr = 0; 也许没有谁对谁错之分，也许只是习惯不同罢了，毕竟C语言是老大哥，诞生的早；而在早期C编程时人们也许不习惯在程序里使用0这样的magic number，转而使用...</description></item><item><title>C++咬文嚼字－'Hijack const'</title><link>https://tonybai.com/2007/03/09/cpp-weigh-every-word-series-hijack-const/</link><pubDate>Fri, 09 Mar 2007 00:00:00 +0800</pubDate><guid>https://tonybai.com/2007/03/09/cpp-weigh-every-word-series-hijack-const/</guid><description>晚上无意翻看Bjarne Stroustrup的&amp;#39;The C++ Programming Language Special Edition&amp;#39;(英文版)第94页，章节5.4 Constants一节，看到这么一句原文&amp;#39;C++ offers the concept of a user-defined constant, a const, to express the notion that a valu...</description></item><item><title>编译Ethereal On Windows</title><link>https://tonybai.com/2006/12/30/build-ethereal-on-windows/</link><pubDate>Sat, 30 Dec 2006 00:00:00 +0800</pubDate><guid>https://tonybai.com/2006/12/30/build-ethereal-on-windows/</guid><description>最近在研究项目下一期中新增的信令跟踪功能，在这个开源盛行的时代，开源工具当然是首选。我们发现了Ethereal，一款强大的网络分析工具包。我们不仅仅要使用Ethereal，而是在Ethereal上做二次开发，增加一个新dissector或者一个plugin，用来分析我们自己的应用层协议。 之所以选择Ethereal还有一个很重要的原因就是它已经支持300多个协议包了，这说明Ethereal的框架已...</description></item></channel></rss>