标签 标准库 下的文章

Rust 的“跨越鸿沟”时刻:Ubuntu 全面拥抱 Rust 意味着什么?

本文永久链接 – https://tonybai.com/2026/02/25/rust-crossing-the-chasm-ubuntu-embrace

大家好,我是Tony Bai。

在技术世界里,一门编程语言的成功往往分为两个阶段:第一阶段是赢得“极客”和“先驱者”的狂热追捧;第二阶段则是说服那些保守、务实的“早期大众”将其投入到枯燥却庞大的企业级生产中。这两个阶段之间,横亘着一条深不见底的“鸿沟”。

2026 年初,Rust 核心团队成员、语言设计的灵魂人物 Niko Matsakis 在参加完 Rust Nation 大会后,发表了一篇引人深思的文章——《What it means that Ubuntu is using Rust》。在这篇随笔中,Niko 借由 Canonical(Ubuntu 的母公司)全面拥抱 Rust 这一标志性事件,极其坦诚地剖析了 Rust 当前在行业接纳生命周期中所处的位置、面临的阵痛,以及为了走向真正的“工业标准”,Rust 社区必须在技术和心理上做出的巨大改变。

本文将深度解读 Niko 的这篇文章,带你透视 Rust 在“后狂热时代”的商业化演进路线、标准库之争、开源商业模式,以及为何“同理心”成了这门硬核语言最大的护城河。

无处不在的“鸿沟”——Rust 到底走到哪了?

如果你熟悉硅谷营销大师杰弗里·摩尔(Geoffrey Moore)的经典理论《跨越鸿沟》(Crossing the Chasm),就会知道任何一项高科技产品在市场推广时,都会经历创新者(Innovators)、早期采用者(Early Adopters)、早期大众(Early Majority)、后期大众(Late Majority)和落后者(Laggards)五个阶段。而在“早期采用者”与“早期大众”之间,存在着一个巨大的断层,这就是“鸿沟”。

Rust 跨过这条鸿沟了吗?

Niko 给出的答案是:这取决于你问的是谁。

  • 在某些互联网巨头(大厂)中:答案是“已经跨越了一大半”。比如在亚马逊云(AWS)这样对性能和资源有着极致苛求的地方,Rust 已经被牢牢确立为构建大规模数据平面(Data Planes)和资源感知代理(Agents)的“正确选择”。它甚至正在向设备端和机器人领域的底层代码渗透。
  • 在普通企业应用中:依然存在一种根深蒂固的刻板印象——“Rust 是给 S3(亚马逊云存储)那些穿西装打领带的高级工程师用的,对于我们普通的 CRUD(增删改查)业务来说,完全是杀鸡用牛刀。”
  • 在安全关键软件(Safety Critical Software)领域:比如汽车的转向柱控制系统或航空航天系统,Rust 依然在艰难地寻找立足点。大多数传统工业巨头仍处于“观望”状态,他们希望让早期采用者先去铺路、踩坑。

这揭示了一个残酷的现实:技术上的优越性并不等同于市场上的普遍接受度

当技术走向“早期大众”时,受众的心态发生了根本性变化。

早期采用者买的是“变革”,他们愿意容忍不成熟的生态,只为获得降维打击的竞争优势;而“早期大众”买的是“生产力提升”,他们极度厌恶风险,追求的是业务连续性——他们想要的是进化,而不是革命。

寻找“标杆客户”——Ubuntu 搭建的跨越之桥

如何说服那些极度厌恶风险的“早期大众”尝试新事物?唯一的答案是:让他们看到与他们相似的成功案例。

这就是为什么 Canonical(Ubuntu 背后的公司)的入局对 Rust 生态具有决定性的历史意义。在 Rust Nation 大会上,Canonical 的工程副总裁 Jon Seager 发表了题为《在 Ubuntu 中大规模采用 Rust》的闭幕演讲。这场演讲完美诠释了什么是“既有远见,又极其务实”。

Canonical 明确表示,他们已将公司内部开发的语言收敛为一个极小的集合:Python、C/C++ 和 Go。

而现在,Rust 被正式引入,并被确立为编写新底层基础工具的首选语言,逐步取代 C、C++ 以及部分 Python 的使用场景。

更令人振奋的是,Canonical 不仅仅是自己“用”,他们还在“反哺”生态,充当桥梁。

Jon Seager 谈到了 Ubuntu 作为操作系统发行版的责任——通过支持内存安全的基础设施库来“向前支付(Pay it forward)”。Canonical 正在提供财务和声誉上的双重支持:
1. 赞助 Trifecta Tech 基金会开发 sudo-rs 和 ntpd-rs(用 Rust 重写关键的系统组件)。
2. 赞助 uutils 组织开发 Rust 版的 coreutils(Linux 核心命令集)。

为什么说 Ubuntu 是完美的“标杆客户”?

在 Linux 用户态领域,Ubuntu 的体量和权威性毋庸置疑。当 Ubuntu 愿意承担尝试新事物的风险,并证明“用 Rust 重写 sudo 是可行的且更安全的”时,这种示范效应是巨大的。

那些“早期大众”企业看到这一幕时会想:“如果连 Ubuntu 这样对稳定性要求极其变态的操作系统底层都在用 Rust,那我们的业务系统用 Rust 应该也是安全的。”

这正是《跨越鸿沟》中破局的核心策略:利用标杆客户的背书,提供能无缝融入现有工作流的“即插即用”方案,从而最小化系统的不连续性。

成长的阵痛——为了壮大,Rust 必须改变“人设”

当目标受众从追求极致的“极客”变成追求稳定的“务实派”时,Rust 面临着一种极其尴尬的转型痛点。

Niko 在文中引用了《跨越鸿沟》里的一段话:

“在任何两个采用群体之间的过渡通常都是极度令人尴尬的,因为你必须在你对旧策略感到最舒服的时候采用新策略……当务实派想听到‘行业标准(Industry Standard)’时,科技公司可能还在向他们推销‘最先进的技术(State-of-the-art)’。”

这精准地命中了 Rust 当下的软肋。

在过去的十年里,Rust 社区的营销口号是“零成本抽象”、“无畏并发”、“最先进的内存安全所有权模型”。这套说辞成功吸引了早期的系统工程师。

但如今,当 Rust 走向大众时,普通开发者更关心的是:“有没有现成的库?”、“编译能不能快点?”和“能不能开箱即用?”

核心冲突爆发点:标准库的规模之争。

在闭门晚宴上,Canonical 的 Jon Seager 提出了一个极具挑衅性的观点:Rust 需要重新审视其维持“极小标准库(Small Standard Library)”的政策。

长期以来,Rust 奉行“标准库只包含最核心的类型和原语,其余全部交给社区(Crates.io)”的哲学。比如,Rust 的标准库里甚至没有随机数生成、正则表达式或 HTTP 客户端。这种设计在早期非常受极客欢迎,因为它保证了核心库的轻量级,并允许社区自由竞争出最好的第三方库(如 serde、tokio)。

但对于“早期大众”来说,这简直是个噩梦。他们不明白为什么解析一个 JSON 或发起一个 HTTP 请求都需要在数以万计的第三方包中去筛选、评估安全性、担心供应链投毒。他们想要的是像 Go 语言或 Python 那样“内置电池(Batteries Included)”的开箱即用体验。

实际上,Rust 社区在 2016 年曾推出过一个名为“Rust 平台(Rust Platform)”的提案,试图官方“钦定”一批高质量的第三方包作为“扩展标准库”。但当时遭到了早期采用者的强烈抵制,理由是“直接改 Cargo.toml 很容易,没必要官方下场干预”。

Niko 反思道:当年早期采用者讨厌的东西,恰恰可能是如今“早期大众”最渴望的东西。

Rust 必须面对现实:过去引导其成功的信条,正在阻碍其向更广阔的市场迈进。

Niko 透露,他正在构思一个名为“电池包(Battery packs)”的新项目,试图在不搞庞大标准库的前提下,为企业级用户提供一种官方背书的、开箱即用的库集合方案。这标志着 Rust 正在从“追求它能成为什么样(What it could be)”向“承认它实际是什么样(What it actually is)”的务实转变。

商业与开源的闭环——如何将“采用率”转化为“真金白银”?

任何一门编程语言生态的长远发展,都离不开雄厚的资金支持。随着 Rust 采用率的爆炸式增长,对 Rust 开源项目和生态系统的维护压力也与日俱增。钱从哪来?

Niko 分享了几个关于开源投资的深刻洞见,这不仅适用于 Rust,对所有开源项目(包括 Go、Node.js 生态)都有极大的启发。

洞见一:投资不一定只是“砸钱”,更是“下场共建”。

对于像 Canonical 这样的纯粹开源组织,最宝贵的投资是“建立深度的组织间关系”。

在“Rust for Linux”项目中,早期都是 Rust 核心维护者在帮 Linux 内核开发者修 Bug。但随着时间推移,现在越来越多的 Linux 内核开发者开始自己动手修复 Rust 编译器或工具链的问题,而 Rust 维护者则退居幕后扮演导师的角色。这种“授人以渔”的贡献,比单纯的捐款更有价值。

洞见二:钱往往在公司“采用 Rust 之前”到来,而不是之后。

我们通常认为,企业是在大量使用某个开源软件后,出于反哺或维护自身利益的目的才会掏钱赞助。

但 Niko 观察到了一个完全不同的趋势:更容易获取的资金,来自于那些“正在考虑但尚未采用” Rust 的公司。

在这些公司内部,通常有一批“早期采用者”(内推者),他们试图说服保守的公司管理层采用 Rust。为了促成此事,他们往往需要拿着一份“准入条件清单”——比如,Rust 必须支持某种特定的芯片架构,或者必须具备某个安全认证组件。

更关键的是,这些内推者手里往往握有预算。为了让这门技术顺利落地公司,他们愿意花钱去填补 Rust 生态中的这些空白。

Rust 基金会的 Alexandru Radovici 证实了这一点:许多对安全性要求极高的公司,手里攥着钱想帮 Rust 补齐短板,却“不知道该怎么花这笔钱”。Canonical 赞助 sudo-rs 本质上也是一样的——他们是在花钱扫除阻碍 Ubuntu 更大规模采用 Rust 的障碍。

开源社区需要建立一种机制,精准对接这些带着预算的“潜在采用者”,将他们的痛点转化为开源项目的开发资金。

社区的终极考验——同理心是最大的护城河

在文章的最后,Niko 抛出了一个直击灵魂的观点,这不仅是给 Rust 社区的警钟,也是所有程序员的必修课:

“如果我们在其中表现得太像‘中学生(Middle School)’,那开源跨越鸿沟的愿景就会彻底破灭。”

什么是“中学生”行为?

当你深度参与一个开源社区时,你会觉得这里充满阳光,欢迎所有人。但对于外部的“早期大众”来说,开源社区往往看起来像一个充满小圈子、潜规则和“口口相传的规矩(Oral traditions)”的排外组织。

一个企业级的保守开发者,带着一个务实的业务问题来到社区提问。他可能只是用错了一个术语,或者没有遵循某种隐形的“社区政治正确”,结果就遭到了一群激进贡献者的群嘲、冷嘲热讽,甚至因为提出不同的设计理念而被强硬关闭 Issue。

这位企业开发者根本分不清哪些是喷子,哪些代表官方立场。他只会觉得:“这个语言的社区太有毒了,我们公司还是用 Java 吧。”

只需要一次粗鲁的回复,就能彻底赶走一个潜在的企业级标杆客户。

Niko 强调,帮助 Rust 最终取得成功的,绝不是更快的编译速度或更完美的类型系统,而是“开源中的同理心”。

“早期大众”并不想参与编程语言的“宗教战争”,他们不关心“纯粹性”,他们只是想按时下班,安全地把产品发布出去。Rust 社区必须学会倾听这群人的声音,理解他们的价值观,用温和、包容和同理心去服务他们,而不是用技术傲慢去居高临下地教训他们。

小结:语言的进化,更是心智的成熟

从 2015 年发布 1.0 版本至今,Rust 用了十余年的时间,证明了自己在技术和理论上的卓越。如今,借由 Ubuntu 这样的重磅标杆客户的背书,它正式站在了跨越主流企业级市场鸿沟的跳板上。

Niko Matsakis 的这篇文章,不仅是对 Rust 现状的一份清醒诊断,更是对整个技术生态演进规律的深刻洞察,也非常值得其他主流编程语言的掌舵者和社区学习借鉴。

无论是标准库的扩展、商业投资机制的完善,还是社区同理心的建设,都表明 Rust 正在经历一场脱胎换骨的“成年礼”。它正在从一个由极客驱动的“炫酷玩具”,蜕变为一个能够承载人类核心数字基础设施的“工业巨兽”。

也许属于 Rust 的激荡时代,才刚刚开始。

资料链接:https://smallcultfollowing.com/babysteps/blog/2026/02/23/ubuntu-rustnation/


你认为 Rust 该“扩充”标准库吗?

Rust 坚持“极小标准库”让极客疯狂,却让企业用户头大。你是支持 Go 这种“内置电池”的开箱即用,还是支持 Rust 这种“社区竞争”的极简主义?你在项目中是否也曾因为 Rust 缺乏某个基础库(如随机数、正则)而感到沮丧?

欢迎在评论区分享你的看法!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准

本文永久链接 – https://tonybai.com/2026/02/10/goodbye-flaky-tests-go-testing-nettest-proposal

大家好,我是Tony Bai。

在 Go 语言的测试哲学中,我们一直追求快速、稳定和可重复。然而,一旦测试涉及到 net 包——无论是 HTTP 服务、RPC 框架还是自定义协议——这种追求往往就会撞上现实的墙壁。

我们通常面临两种选择:要么在 localhost 上监听真实端口,但这会导致测试并发时的端口冲突、防火墙干扰以及操作系统层面的不确定性;要么使用 net.Pipe,但它那“同步、无缓冲”的特性与真实的 TCP 连接大相径庭,常常导致生产环境运行良好的代码在测试中死锁。

为了彻底解决这一“最后一公里”的测试难题,Go 团队的 Damien Neil 提议引入 testing/nettest。这是一个完全在内存中运行,但行为上高度仿真真实网络栈(支持缓冲、异步、错误注入)的实现。

本文将和你一起剖析该提案的背景、设计细节以及它将如何改变我们编写网络测试的方式。

为什么我们需要 testing/nettest?

要理解 nettest 的价值,我们首先需要审视现状。目前的 Go 标准库在网络测试辅助方面,存在显著的“中间地带真空”。

net.Pipe 的致命缺陷

net.Pipe() 是目前标准库提供的唯一内存网络模拟工具。但它本质上是一个同步内存管道

  • 同步阻塞:写入端必须等待读取端准备好,数据才能传输。没有内部缓冲区。
  • 死锁陷阱:真实的 TCP 连接是有内核缓冲区的。应用代码往往假设“由于有缓冲,我可以先写一点数据,然后再去读”。这种假设在 net.Pipe 上会直接导致死锁——写操作阻塞在等待读,而读操作还没开始。
  • 行为失真:它无法模拟网络延迟,也无法模拟缓冲区满时的阻塞行为。

localhost 的不可靠性

使用回环地址(Loopback)是另一种常见做法,但它带来了“外部依赖”:

  • 端口资源:并行运行成千上万个测试时,临时端口可能耗尽。
  • 环境干扰:CI 环境可能有奇怪的防火墙规则或网络配置。
  • 速度瓶颈:尽管是回环,依然涉及系统调用和内核协议栈的开销,比纯内存操作慢得多。

synctest 的拼图

Go 1.24 引入了实验性的 testing/synctest 包,旨在通过虚拟时钟解决并发测试中的时间依赖问题。然而,synctest 难以接管真实的系统网络调用。为了让 synctest 发挥最大威力,Go 需要一个完全由用户态代码控制、不依赖操作系统内核的网络实现。nettest 正是这块关键的拼图。

nettest 核心设计:全功能内存网络栈

testing/nettest 的目标非常明确:提供 net.Listener、net.Conn 和 net.PacketConn 的内存实现,使其行为尽可能接近真实的 TCP/UDP,同时暴露极强的控制力。

异步与缓冲:还原真实的 TCP 行为

这是 nettest 与 net.Pipe 最大的区别。nettest.Conn 内置了缓冲区。

  • 写操作:写入数据到内部缓冲区后立即返回,无需等待对端读取。
  • 读操作:从缓冲区读取数据。
  • 缓冲区控制:提案引入了 SetReadBufferSize(size int) 方法。你可以将缓冲区设置为 0(模拟 net.Pipe),也可以设置为 4KB 或无限大。这使得开发者可以精确测试“网络拥塞”导致写入阻塞的边缘情况。
// 创建一对连接
client, server := nettest.NewConnPair()

// 模拟一个拥塞的连接,缓冲区仅为 1 字节
server.SetReadBufferSize(1)

// 此时写入大量数据,client.Write 将会阻塞,直到 server 端读取
go func() {
    client.Write([]byte("hello world"))
}()

地址模拟与配置钩子

在真实网络中,我们可以通过 IP 地址来区分连接来源。nettest 通过 netip.AddrPort 模拟了这一点。

更妙的是 Listener.NewConnConfig 方法,它允许我们在 Server Accept 之前,对“即将到来”的连接进行修改。

实战场景:测试 IP 白名单中间件

以往测试 IP 白名单,你可能需要复杂的 Mock 或者真的去配置网卡。现在:

l := nettest.NewListener()
defer l.Close()

// 模拟一个来自特定 IP 的恶意连接
go func() {
    conn := l.NewConnConfig(func(c *nettest.Conn) {
        // 伪造源 IP
        c.SetLocalAddr(netip.MustParseAddrPort("192.168.1.100:12345"))
    })
    conn.Close()
}()

conn, _ := l.Accept()
// 在这里断言你的中间件是否正确拒绝了该 IP

故障注入:测试“那 1% 的异常”

网络编程中最难测试的不是“连通”,而是“断连”、“超时”和“读写错误”。nettest 将错误注入标准化了。

它提供了一系列 Set*Error 方法:

  • SetReadError(err)
  • SetWriteError(err)
  • SetAcceptError(err)
  • SetCloseError(err)

你可以通过 SetReadError 模拟连接在中途突然 Reset,验证你的客户端是否会按预期进行重试。这些注入的错误会被自动包装在 *net.OpError 中,以保持与真实网络行为的一致性。

状态内省 (Introspection)

我们在测试中经常需要断言“连接是否已关闭”或者“是否有数据可读”。在标准 net 包中,这通常需要发起一个阻塞的 Read 调用,如果超时则认为无数据。这种基于时间的断言是 Flaky Test 的温床。

nettest 提供了非阻塞的状态查询方法:

  • CanRead() bool:缓冲区里有数据吗?或者连接关闭了吗?
  • CanAccept() bool:Accept 队列里有连接吗?
  • IsClosed() bool:连接彻底关闭了吗?

配合 synctest,这将允许我们编写出逻辑极其严密、不依赖 time.Sleep 的确定性测试。

UDP 也能 Mock:PacketNet

除了面向流(Stream)的 TCP 模拟,提案还照顾到了面向报文(Packet)的 UDP。

由于 UDP 没有“连接”的概念,不能像 TCP 那样简单返回一对 Conn。nettest 引入了 PacketNet 的概念,它就像一个微型的内存交换机。

// 创建一个虚拟的 UDP 网络环境
pn := nettest.NewPacketNet()

// 在这个网络中创建两个端点
c1, _ := pn.NewConn(addr1)
c2, _ := pn.NewConn(addr2)

// c1 发送给 c2
c1.WriteTo([]byte("ping"), addr2)

// c2 收到数据
buf := make([]byte, 1024)
n, src, _ := c2.ReadFrom(buf)

这使得测试基于 UDP 的自定义协议(如 QUIC 的某些握手流程、或是自定义的游戏协议)变得轻而易举,且完全隔离于宿主机网络。

边界与权衡:它不是万能的

在提案的讨论中,Damien Neil 非常清晰地界定了 nettest 的边界。理解它“不做”什么,和理解它“做”什么同样重要。

  1. 不模拟特定的系统错误码:你无法通过 nettest 测试你的程序是否正确处理了 Linux 特有的 ECONNREFUSED 或 Windows 特有的错误码。因为跨平台模拟这些行为极其复杂且容易出错。
  2. 不模拟网络延迟和抖动:nettest 的数据传输是瞬间完成的。如果你需要测试 TCP 拥塞控制算法或超时重传的具体时间点,你可能仍需要更复杂的模拟器或真实网络。
  3. 不支持 Unix Domain Socket (目前):虽然社区有呼声(如 crypto/ssh 测试需要),但目前的提案聚焦于 TCP/UDP 风格的 API。不过,设计上并未把路堵死,未来可以扩展。

社区反响与未来展望

该提案一经发布,立即引起了 Go 社区资深开发者的强烈共鸣。

  • Crypto 团队的期待:前Go 安全负责人 FiloSottile 表示,构建用于测试 crypto/tls 和 ssh 的跨平台连接对一直是一个巨大的痛点,nettest 将极大地简化标准库自身的测试代码。
  • HTTP 测试的革新:Issue #14200 曾讨论过让 httptest.Server 支持内存网络以加速测试。nettest 的出现,使得 httptest.NewUnstartedServer 未来可能支持传入一个内存 Listener,从而让 HTTP 测试飞起来。

下一步是什么?

考虑到 API 表面积较大,Go 团队计划遵循“实验先行”的原则。nettest 将首先在 golang.org/x/exp/testing/nettest 中落地。这意味着我们很快就能在项目中引入并尝鲜了。待经过充分的社区验证和 API 打磨后,它最终将进入标准库,成为 testing 包下的一员猛将。

小结

testing/nettest 的提案,看似只是增加了一个测试工具,实则反映了 Go 团队在工程效能上的深层思考。它试图消除测试中的“不确定性”,让网络测试回归逻辑的本质,而不是与操作系统和网络协议栈的噪声做斗争。

对于我们每一位 Gopher 而言,这意味着未来的测试代码将更少依赖 time.Sleep,更少处理端口冲突,运行速度更快,且更加稳定。让我们拭目以待,并准备好在 x/exp 发布的第一时间去拥抱它。

资料链接:https://github.com/golang/go/issues/77362


聊聊你的测试难题

网络测试中的“随机失败”曾让你抓狂吗?你是否也曾为了避开 net.Pipe 的坑而被迫在测试里撒满 time.Sleep?对于即将到来的 nettest,你最期待它的哪个功能?

欢迎在评论区分享你的测试心得或吐槽!让我们一起期待测试变得更简单、更稳健。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats