标签 GC 下的文章

当Gopher拥有了“Go语言女友”:一张图带你读懂Go的那些“可爱”特性

本文永久链接 – https://tonybai.com/2025/05/30/gopher-girlfriend

大家好,我是Tony Bai。

最近,一张名为 “gopher gf” (Go 语言女友) 的 Meme 图在开发者社区悄然流传,引得无数 Gopher 会心一笑。这张图用拟人化的“女友”特质,巧妙地描绘了 Go 语言的诸多优点和社区文化梗。

那么,这位集万千宠爱于一身的“Go 语言女友”,究竟有哪些令人着迷的“可爱”特性呢?今天,就让我们化身“恋爱观察员”,逐条“解密”这张 Meme 图,看看 Go 语言是如何成为许多开发者心中“理想型”的。

“Gopher 女友”的可爱特质大揭秘!

让我们一起来看看这位“Gopher 女友”的闪光点,以及它们在 Go 语言世界中的真实写照:

1. “cute” (可爱)

  • Meme 解读: 她有着 Gopher 吉祥物那标志性的、憨态可掬的可爱模样。
  • Go语言真相: 这首先让人联想到 Go 语言那只呆萌的土拨鼠吉祥物。更深层次来说,Go 语言的语法简洁、核心概念少、没有过多的“语法糖”,使得代码看起来清爽直接,就像一个不施粉黛、自然可爱的女孩,让人一见倾心。

2. “low-maintenance” (低维护)

  • Meme 解读: 她不“作”,好相处,不需要你花太多心思去“伺候”。
  • Go语言真相: 这简直是 Go 语言的真实写照!
    • gofmt 强制统一代码风格,彻底终结了关于代码格式的“圣战”,减少了团队协作中的摩擦。
    • 强大的工具链 (go build, go test, go mod 等) 让构建、测试、依赖管理变得异常简单。
    • 静态编译生成单个可执行文件,部署过程干净利落,没有复杂的运行时依赖和“DLL地狱”。
    • 内置垃圾回收 (GC) 机制,虽然不是“银弹”,但也极大地减轻了开发者的内存管理负担。

这些特性使得Go项目的维护成本相对较低,开发者可以将更多精力聚焦在业务逻辑上。

3. “leaves you love letters in go.mod” (在 go.mod 里给你留情书)

  • Meme 解读: 多么浪漫的表达!她把对你的“心意”(依赖)都清清楚楚地写在了 go.mod 这封“情书”里。
  • Go语言真相: 自从 Go Modules 成为官方推荐的依赖管理方案后,go.mod 文件就成了每个 Go 项目的“标准配置”。它清晰、明确地记录了项目的模块路径、Go 版本以及所有直接和间接依赖及其版本号。这种依赖关系的透明化和可追溯性,就像一封真挚的“情书”,让你对项目的“家底”一目了然,极大地方便了依赖管理和构建复现。

4. “panics but quickly recovers” (会panic但能快速恢复)

  • Meme 解读: 她偶尔也会有小情绪(panic),但总能很快调整过来(recover),不至于让关系彻底崩溃。
  • Go语言真相: Go 语言通过 panic 来表示严重的、通常是程序缺陷导致的运行时错误。但与其他一些语言遇到类似情况直接崩溃不同,Go 提供了 recover 机制。通过在 defer 函数中调用 recover(),我们可以捕获 panic,记录错误信息,执行一些清理操作,甚至尝试让程序从一个可控的状态恢复或优雅降级,而不是让整个服务“一蹶不振”。这种设计赋予了 Go 程序更强的韧性

5. “shares her emotions by communicating” (通过沟通分享她的情感)

  • Meme 解读: 她乐于沟通,而不是让你猜她的心思。
  • Go 语言真相: 这无疑是在致敬 Go 并发编程的核心原语——channel!Go 语言信奉“不要通过共享内存来通信,而要通过通信来共享内存” (Don’t communicate by sharing memory, share memory by communicating) 的并发哲学。Channel 正是 goroutine 之间进行数据传递和状态同步的主要桥梁,它使得并发逻辑的表达更加清晰和安全。

6. “thinks mutexes are romantic” (认为互斥锁是浪漫的)

  • Meme 解读: 这个有点“硬核”的浪漫!她认为互斥锁 (mutex) 这种保护共享资源、确保“二人世界”不被打扰的机制,是充满“安全感”的浪漫。
  • Go语言真相: sync.Mutex 是 Go 中最常用的并发同步原语之一,用于在并发访问共享资源时避免竞态条件。虽然 Go 推崇通过 channel 进行通信,但在某些场景下,使用互斥锁保护共享数据仍然是必要且高效的。这个梗幽默地反映了 Gopher 对并发安全的极致追求和对底层同步机制的熟悉。

7. “doesn’t cry when invalid memory address or nil pointer dereference” (当无效内存地址或空指针解引用时不会哭)

  • Meme 解读: 遇到问题,她不“哭哭啼啼”(难以追踪的错误),而是直接“告诉你”(panic)。
  • Go 语言真相: 当 Go 程序遇到空指针解引用、数组越界等严重的运行时错误时,它会立即 panic,并打印出清晰的错误信息和堆栈跟踪。这与某些语言可能产生的段错误 (segmentation fault) 或未定义行为,导致问题难以定位和复现相比,无疑是一种更“直接”和有助于快速暴露和定位 Bug 的行为。

8. “thinks ORM is astrology for devs” (认为 ORM 对开发者来说是占星术)

  • Meme 解读: 她对那些过度封装、隐藏细节、让人感觉像“玄学”的 ORM 框架持保留态度。
  • Go语言真相: 这是 Go 社区一个广为人知的“文化梗”。许多 Gopher 更倾向于使用标准库的 database/sql 包配合轻量级的 SQL 构建库(如 sqlx等),或者直接编写原生 SQL。这背后是对数据层掌控力、性能透明度以及避免不必要的“魔法”和复杂抽象的追求。他们认为,SQL 本身就是一种强大的 DSL,过度封装反而可能引入新的问题。

9. “cooks you meals from scratch” (从零开始为你做饭)

  • Meme 解读: 她心灵手巧,能用最新鲜的食材(标准库)为你烹制美味佳肴,而不是依赖各种半成品(重型框架或过多第三方库)。
  • Go 语言真相: Go 拥有一个异常强大且设计精良的标准库。无论是网络编程 (net/http, net)、JSON/XML 处理 (encoding/json, encoding/xml)、文件操作 (os, io)、加密解密 (crypto/*),还是并发原语 (sync, sync/atomic),标准库都提供了高质量的实现。这使得 Go 开发者在很多场景下可以“自给自足”,减少对外部依赖,构建出更轻量、更可控的系统。

10. “reviews your code every night” (每晚都审查你的代码)

  • Meme 解读: 她非常关心你的代码质量,时刻帮你把关。
  • Go 语言真相: 这可以从几个层面理解:
    • 静态类型检查: Go 是一门静态类型语言,编译器在编译阶段就能帮你发现大量的类型错误和低级 Bug,就像一位尽职的“审查员”。
    • go vet 等工具: Go 工具链内置了 go vet 等静态分析工具,可以帮助检查代码中潜在的错误或可疑构造。
    • 社区文化: Go 社区非常重视 Code Review 的实践,鼓励通过同行评审来提升代码质量。
    • 语言设计本身: Go 语言的简洁性和一些强制性规范(如未使用变量的编译错误),也在某种程度上“迫使”开发者写出更清晰、更规范的代码,更易于审查。

11. “compiles fast” (编译快)

  • Meme 解读: 她做事麻利,从不拖沓。
  • Go 语言真相: 这绝对是 Go 语言最令人称道的特性之一!Go 的编译速度极快,即使是中大型项目,编译过程通常也只需要十几秒钟。这极大地提升了开发者的工作效率和迭代速度,减少了漫长的等待时间,让开发体验如丝般顺滑。快速编译使得“编码-编译-测试”的循环非常高效。

小结:“Go语言女友”,为何如此理想?

看完了对 “gopher gf” Meme 图的逐条解读,我们不难发现,这位“理想女友”的每一个“可爱特质”,都精准地映射了 Go 语言在现实世界中的核心优势:

  • 简洁易学 (cute)
  • 维护成本低 (low-maintenance)
  • 依赖管理清晰 (leaves you love letters in go.mod)
  • 具备韧性的错误处理 (panics but quickly recovers)
  • 推崇通信共享内存的并发模型 (shares her emotions by communicating)
  • 重视并发安全 (thinks mutexes are romantic)
  • 明确的运行时错误反馈 (doesn’t cry when invalid memory address or nil pointer dereference)
  • 崇尚直接、避免过度抽象 (thinks ORM is astrology for devs)
  • 强大的标准库 (cooks you meals from scratch)
  • 利于代码质量保障的特性与文化 (reviews your code every night)
  • 闪电般的编译速度 (compiles fast)

正是这些特性,使得 Go 语言在云原生、微服务、分布式系统、网络编程、命令行工具等众多领域大放异彩,成为越来越多开发者和企业的首选。它就像一位可靠、高效、易于相处且不乏生活情趣的“伴侣”,帮助我们更轻松、更愉快地构建出色的软件系统。

当然,Meme 终归是 Meme,它用一种轻松幽默的方式,概括了 Go 语言的诸多美好。现实中的 Go 语言也并非完美无缺,它依然在不断发展和进化。但不可否认的是,这些“可爱”的特质,正是 Go 语言独特魅力和强大生命力的源泉。

那么,你心中的“Go 语言女友”又是怎样的呢?或者,你最欣赏 Go 语言的哪个“可爱”特质?

欢迎在评论区分享你的看法和脑洞!如果你觉得这篇文章有趣且让你对 Go 语言有了更深的(或者说更“萌”的)理解,也请转发给你身边的 Gopher 朋友们,一起感受这份来自代码世界的“浪漫”与“可爱”!

注:本文部分内容经过AI润色和优化,以提升读者阅读体验。


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

Google I/O 2025 Go 语言进展:生产力、生产就绪与 AI 赋能

本文永久链接 – https://tonybai.com/2025/05/25/go-at-googleio-2025

大家好,我是Tony Bai。

在Google I/O 2025大会上,Go 产品负责人 Cameron Balahan 和开发者关系负责人 Marc Dougherty 详细阐述了 Go 语言在生产力、生产就绪度和开发者体验方面的最新进展及未来规划。演讲强调了 Go 语言以规模化为核心的设计理念及其三大指导原则:生产力、超越语言的完整体验和生产就绪。重点介绍了Go 1.23Go 1.24版本在生产力方面的革新,包括引入迭代器简化循环、gopls 的智能现代化能力以及通过 go get 管理 Go 工具链;在生产就绪性方面,突出了 WebAssembly 支持的增强、安全体系的持续深化(特别是后量子密码学的透明集成和 FIPS-140 支持的便捷启用)以及核心性能的显著提升(如全新的 map 实现)。此外,演讲还强调了 Go 语言在 AI 基础设施构建中的核心地位,并展望了 Go 1.25+ 在 SIMD 支持、多核硬件优化等方向的探索,同时重申了 Go 1.0 的兼容性承诺。

这里是基于演讲视频,借助AI整理的文字稿,我做了简单校对和格式调整,供大家参考。

原视频链接:https://www.youtube.com/watch?v=kj80m-umOxs 建议大家也都看一下。


我是 Cameron,我是 Google Go 编程语言的产品负责人。我是 Marc,我负责 Go 的开发者关系。

对于那些刚接触我们项目的人来说,Go 是一个由 Google 支持的开源编程语言,它能让开发者和软件工程团队快速构建更安全、可靠和可扩展的生产系统。

Google 在 15 年前将 Go 作为一个开源项目发布,在此之前两年,Google 为了应对自身在构建和维护大规模、关键任务系统方面面临的挑战而启动了这个项目。使用现有的工具,我们不得不在动态解释性语言的生产力和强类型编译语言的生产就绪性之间做出选择。但我们两者都想要,所以我们构建了Go

Go 的核心前提是开发工具从一开始就应该优先考虑可扩展性,这意味着要考虑到现代软件的架构方式、现代工作负载运行的环境,以及最重要的,编写、操作和维护这一切的团队。因此,考虑到这一点,我们围绕三个原则构建了Go,这些原则至今仍在指导着我们。

首先,Go 是高效的。它易于学习,易于维护,可读性强,并且能够很好地适应不同的团队、工作负载和用例。

其次,Go 不仅仅是一门语言,它是一个完整的开发者体验。从 IDE 到生产环境,我们提供端到端的解决方案,涵盖整个软件开发生命周期的所有接触点。我们提供所有这一切,开箱即用,并带有合理的、可自动调整的默认设置。

第三,Go 是生产就绪的。它可靠、高效、稳定且安全,这使得它非常适合从简单应用到企业系统和关键基础设施的各种场景。

多年来,Go 已经成为现代云计算的核心,并由此延伸到现代网络。世界上许多最知名的云技术都是用 Go 编写的,包括 Kubernetes、Docker、Terraform 等等。各种规模的公司,从个人到初创企业再到大型企业,都已采用 Go,尤其是在其基于云的工作负载方面。这在很大程度上是因为 Go 是为云计算而专门构建的。Go 所支持的库、集成和架构是为云而生的,而不是后来才为云进行改造的。这意味着你可以比使用其他语言更快、更容易地实现云计算的优势。

但你不必相信我的话。Go 用户一直给予我们非凡的反馈和客户满意度(注:93%)——这种水平在行业内几乎闻所未闻。使用情况也证明了这一点。如今,Go 比以往任何时候都更受欢迎,拥有数百万开发者,并且仍在快速增长。事实上,根据去年的NewStack的一项调查,Go 是仅有的两种增长速度超过开发者本身增长速度的语言之一。另一种是 Rust,我们认为它与 Go 配合得非常好,但这是另一个话题了。这样的迹象随处可见。Go 一直在 Stack Overflow 上被评为最受欢迎的技术之一。去年,Cloudflare 报告称,Go 是互联网上支持 API 调用的第一大语言

因此,无论你是个人开发者、企业,还是介于两者之间的组织,Go 都能让你快速、更可靠地构建和扩展你的项目。你可能会很高兴你这样做了。接下来,Marc 将深入探讨 Go 的所有最新进展。交给你了,Marc。

谢谢,Cameron。Go 每年发布两次新的主版本,分别在八月和二月。在过去的一年里,我们在 1.23 和 1.24 版本中发布了许多令人兴奋的新功能,以帮助你和你的团队提高工作效率。

在1.23 版本中,我们引入了带有 seq 和 seq2 类型的迭代器。相较于经典的 Go 风格,迭代器不仅仅是标准库中的一个新类型。它们是一种优雅的方式,可以使用已经熟悉的 for range 表达式来简化循环,并将迭代的机制与循环体分开。在迭代器出现之前,有几种不同的方法来遍历数据。一些方法会返回一个包含所有结果的切片,这对于大型集合来说可能效率低下。另一种方法是创建自己的迭代器对象,就像这段代码一样,它使用了 Google Cloud Storage 库。注意这里的复杂性。我们的循环中有流程控制和错误检查。并且该错误检查需要在每个循环中重复。使用迭代器,你可以使用熟悉的 for range 语法来执行循环。复杂的流程控制则保留在迭代器内部。这使得我们的循环体可以专注于处理文件或错误,而无需担心流程控制。

从 1.24 版本开始,标准库在 strings、slices 和 maps 包中包含了一系列迭代器。因为迭代器只是一个函数,所以你可以定义自己的迭代器,包括为其他地方定义的集合类型定义迭代器。这是我为 Cloud Storage 示例定义的迭代器。声明看起来有点复杂,但你可以看到这里的流程控制与之前具有相同的效果。这个迭代器让我们能够将流程控制处理从循环中分离出来,并使它们更具可读性。

随着像迭代器这样的新概念的引入,Go 的垂直集成工具可帮助你的代码库与最新的模式和习惯用法保持同步。Go 的语言服务器 gopls 可以与你的 IDE 集成,既可以通过大多数 IDE 中的语言服务器支持,也可以通过插件(如 VS Code Go 扩展)实现。Gopls 在常规的语言服务器功能方面提供帮助,例如类型检查、函数签名和引用。但 gopls 的功能远不止于此。还记得那个复杂的迭代器定义吗?由于 gopls 从第一天起就知道新功能,因此它可以帮助你在编写时避免错误。在这里,它注意到了一个错误,即我们的迭代器可能会在应该停止后调用我们的 yield 函数。gopls 包含一套现代化功能,这些常见模式后来已作为语言特性或标准库新增功能得到解决。虽然你可以在整个代码库上运行现代化工具,但 gopls 可以在你编辑的任何地方内联建议它们。这里有一些旧模式的例子在左边,以及它们现代化的替代方案在右边。

最后一个现代化工具展示了 JSON 解析器的一个新特性,称为omitzero。JSON 包从 Go 1.0 开始就是 Go 的一部分。它通过简化 Go 结构体的序列化,实现了 API 客户端和服务器的人性化开发。omitzero 选项的添加解决了一些在处理 Go 的零值(如空结构体和未初始化的 time.Time 对象)时常见的错误和令人意外的行为。这些新增功能让你能够更好地控制对象如何序列化为 JSON,并避免可能的错误和混淆来源。

你是否需要更新你的 Go 运行时以利用新功能?从 1.23 版本开始,你可以使用 go get 来管理 Go 工具链,就像管理任何其他依赖项一样。Go 会根据需要下载更新的工具链,让你的团队可以使用最新的功能,而无需停下来手动更新工具链。这也适用于依赖项。如果你依赖了需要 1.24 版本的代码,Go 会更新你模块的 go 指令以要求 1.24 版本,并自动获取 1.24 运行时。Go 语言和 Go 工具不断寻找新的方法来帮助你保持代码库的可读性和现代化,并让你的团队保持专注和高效。

Marc 刚刚向你介绍了让你更高效的一些新功能。但请记住,Go 关注的是生产力和生产就绪性。那么,让我们来谈谈 Go 1.23 和 1.24 中那些让你的应用程序更健壮、更安全、性能更高的最新功能。

正如我之前所说,Go 的创始原则部分集中在其可移植性和对现代工作负载运行的现代环境的关注上。这些环境在不断发展。随着它们的发展,我们希望确保 Go 能够跟上步伐。我们做到这一点的一种方式是在 Go 1.24 中显著改进了 Go 对 WebAssembly 的支持。WebAssembly,或称 Wasm,是一种二进制指令格式和沙盒化运行时环境,它开启了许多新的有趣用例,尤其是在云端。包括 Go 在内的几种语言都能够编译 Wasm 模块,这些模块包含可在所有 Wasm 主机上运行的可移植的、与体系结构无关的字节码。同一个 Wasm 主机应用程序可以调用来自多个不同 Wasm 模块的方法,这些模块可以根据需要用一种语言或多种语言混合编写。这些 Wasm 模块是可热加载的,并在内存安全的沙盒化运行时中运行,具有结构化的控制流和验证。任何系统调用都通过 Wasm 运行时进行路由,这提供了一个额外的安全层,有点像一个极其轻量级的容器。尽管存在这一层抽象,但 Wasm 应用程序效率极高,能够在主机上实现接近本机的性能。这使得它们特别适用于高性能、低延迟的用例,例如边缘计算。例如,你可以在 Google Cloud 服务扩展上运行你的 Wasm 代码,它在 200 多个国家的 200 多个边缘位置提供边缘计算。

Go 在 Go 1.11 版本中通过 JS Wasm 移植首次引入了对 Wasm 的支持。Wasm 本身最初是为浏览器设计的。JS Wasm 移植通过允许你通过 JavaScript 主机定位网页,从而启用了此用例。Go 开发者利用这个功能制作了一些非常有趣的东西,尤其是游戏。甚至还有一些利用 JS Wasm 移植的 Go 开源游戏引擎。Go 开发者可以使用这些项目轻松开发在浏览器中运行的令人印象深刻的 2D 游戏。随着 Wasm 的发展,Go 也在发展。在 Go 1.21 中,我们引入了对 WebAssembly 系统接口(WASI)预览版 1 的支持。WASI 提供了一个 POSIX 风格的接口,用于与系统资源进行交互,例如文件系统、系统时钟、数据实用程序等等。在这个例子中,你可以看到一个简单的“Hello, world!”程序,我们通过开头的编译标志将其编译为 Wasm。然后我们可以使用众多免费开源的 Wasm 运行时和库之一来运行该程序。在这种情况下,我们使用的是 wazero,一个用 Go 实现的开源项目。从 Go 1.21 开始,Go 开发者可以将 Wasm 模块构建为可执行文件,在 Wasm 运行时中启动它,并运行至完成。

这就引出了今天的内容。在 Go 1.24 中,我们通过两种主要方式扩展了 Go 的 Wasm 功能。首先,Go 1.24 允许你使用 go:wasmexport 编译器指令将 Go 函数导出到 Wasm 主机。当我们将这样的代码编译成 Wasm 模块时,我们可以在 Wasm 主机中导入它,Wasm 主机可以直接调用模块导出的函数。其次,Go 1.24 添加了对构建 WASI 反应器 (reactor) 的支持。当你使用此功能以 Reactor 模式构建 Wasm 模块时,即使模块执行完毕,它也可以保持初始化状态。这对于你希望无限期可用的长时间运行的插件或扩展非常有用。初始化一次,让它保持运行,它可以继续响应调用,包括通过维护状态。在这个例子中,我们使用 wazero 的库来创建一个 Wasm 主机,它将调用我们在上一个例子中导出的 add 函数。不过,这次我们将使用高亮显示的构建标志以反应器模式构建 Wasm 模块。现在,我们可以多次运行 add 函数而无需重新初始化它。

接下来,我们来谈谈 Go 如何让你的应用程序更安全。Go 一直在安全特性和功能方面处于领先地位。在 Go 1.13 中,我们引入了模块代理和校验和数据库,它们缓存并记录 Go 生态系统中所有依赖项的哈希值,保护你免受中间人攻击和其他对依赖项的篡改。然后,在 Go 1.18 中,我们引入了内置的模糊测试 (fuzz testing),这是第一个将原生模糊测试内置并集成到其标准工具链中的主流编程语言。你可以将模糊测试视为一种自动化测试形式,它智能地操纵程序的输入以找出错误,尤其是安全漏洞。2022 年,我们推出了 Go 的端到端漏洞管理系统,它可以在任何地方(从 IDE 到运行时)发现依赖项中的已知漏洞。通过分析从你的代码到依赖项的调用图,Go 的漏洞管理工具能够检测你是否实际调用了易受攻击的代码,从而消除了绝大多数的误报。

基于我们对安全的关注,在 Go 1.24 中,我们引入了对后量子密码学的支持,所有这些都在幕后透明地实现。我们还改进了对 FIPS-140 的支持,这是一项美国政府合规制度,其中包括用于加密应用的已批准算法。你可以在不更改任何代码的情况下启用 FIPS 模式,既可以在运行时使用高亮显示的调试标志,也可以在构建时使用高亮显示的构建 flag。

最后,我们继续专注于使 Go 更快、更高效。我们做到这一点的一个重要方式是引入了一个全新的内置 map 类型实现,它基于一种名为 Swiss Tables 的新哈希表设计。从 Go 1.24 开始,map 透明地使用新的 Swiss Table 实现。在微基准测试中,使用新实现的 map 操作比 Go 1.23 快了高达 60%,尤其是在处理大型 map 时。这一切都无缝集成在 Go 的内置 map 中。无需调整你的代码。只需升级即可。

还有更多,包括 Go 1.23 和 1.24 中许多新的底层工具,用于提高效率。例如,在 Go 1.23 中,我们引入了 Unique Package,可以高效地对值进行去重和比较。在 Go 1.24 中,我们引入了 weak.Pointers,它允许你安全地指向一个对象而不会阻止它被垃圾回收,以及 AddCleanup 函数,这是一种更灵活、更高效且更不容易出错的终结机制。还有更多,包括改进的内存分配速度和整体速度提升。所有这些都延续了我们保持 Go 既高效又生产就绪的重点。

接下来,让我们把话筒转回给 Marc,让他快速介绍一下 Go 在生成式 AI 中的最新应用。

正如你刚才听到的,Go 拥有许多特性,使其成为构建生产系统的绝佳语言。像高效的网络库和集成的结构体标签这样的特性,使其非常适合构建分布式系统。这也是 Go 在云基础设施和服务中如此普遍的重要原因。同样的这些原因也使得 Go 成为当今构建 AI 基础设施和服务的绝佳选择。流行的生成式 AI 工具和库,如 Ollama、Local AI、LangChain Go、Genkit 等等,都是用 Go 编写的。就像之前的主要基础设施项目一样,这些工具和库利用 Go 的生产力和生产就绪性来创建高度可扩展且更可靠的关键任务服务,数百万来自不同语言生态系统的开发者依赖这些服务来支持其 AI 驱动的工作负载。

事实上,云和 AI 系统之间的共同点比你想象的要多。由于 LLM 通常需要专用的、专门的计算资源,因此它们通常作为通过 API 调用的网络服务运行。让我们以 Go 博客最近一篇文章中概述的检索增强生成 (RAG) 系统为例。我们的 RAG 系统使用向量数据库来存储相关文档,以便在回答用户问题时提供给我们的 LLM。向量数据库依赖于专门的嵌入模型,因此我们可以高效地查询与用户问题相似的文档。我们将研究三种不同的框架,用于将这些服务连接在一起。

对于我们的第一个例子,我们将直接使用 Gemini 和 Weaviate 客户端库。这段代码来自用户查询处理程序。我们正在使用 Weaviate 的 GraphQL 接口来获取文档。查询本身有点长,所以我们使用了一个辅助函数。这种方法的一个缺点是,如果我们更改向量数据库,就必须重写辅助函数。

在这里,我们使用的是 LangChain Go,它为我们的 LLM 和向量数据库提供了接口抽象。如果我们替换这些组件,相似性搜索和从单个提示生成调用的代码将无需更改。

最后,我们来看看 Firebase Genkit for Go,目前处于测试阶段。它提供了与 LangChain Go 类似的抽象。Genkit 包含生产级功能,如提示管理和可观察性,这些功能可能在代码中不可见,但可以改善整体开发者体验。

随着你的 AI 系统的发展,Go 对简单性的强调意味着即使代码规模和复杂性增加,你的代码仍然保持可读性。Go 的特性,如对象嵌入和接口,使得在需求和技术发生变化时可以无缝迁移——而它们总是会发生变化。Go 在跟上快速变化方面的成熟能力使其在一些最知名的云基础设施组件中取得了成功。推动 Go 在云领域普及的相同特性,也使其成为我们构建未来 AI 基础设施的绝佳选择。

我希望我们已经在这个视频中证明了,Go 围绕生产力、开发者体验和生产就绪性的创始原则,仍然是我们今天优先考虑工作的依据。在结束之前,我想花几分钟时间让大家一窥 Go 1.25 及更高版本即将推出的内容。

首先,在 Marc 关于 AI 的讨论基础上,我们对围绕 SIMD 所做的工作感到非常兴奋。SIMD 使现代 CPU 能够执行向量化数组操作,并行运行某些类型的循环。这些功能对于许多类型的性能优化至关重要,包括某些类型的 AI 基础设施所需的优化。

在性能方面,我们在多核硬件方面有很多令人兴奋的机会,包括垃圾回收器和调度器的功能,这些功能可以更好地利用现代 CPU 架构中的非一致性内存访问。

切换到语言本身,在我们持续推动提高生产力方面,我们还有很多需要完善的地方,特别是在泛型操作的灵活性方面。有关该工作的更多信息,请查看我们在 GitHub 上 Go 项目的讨论。

在我们做所有这些以及更多事情的同时,你可以放心,我们现在和将来所做的任何更改都将继续履行 Go 的兼容性承诺。Go 仍然并将永远保持与 Go 1.0 的完全向后兼容。

在我们结束时,我们想花点时间感谢 Go 社区。我们,Go 团队,致力于在未来很长一段时间内保持 Go 的生产力和生产就绪性。但我们知道我们并不孤单。今天,我们的生态系统比以往任何时候都更大、更健全。我们继续看到许多非常高质量的工具和库涌现,尤其是在围绕生成式 AI 的新用例方面。我们看到世界各地成千上万的 Gopher 聚会、参加 Go 会议,并在网上协作,所有这些都是因为他们热爱 Go。所以,感谢 Go 社区。正是因为你们的贡献,Go 才得以发展,并且比以往任何时候都更具相关性。我们非常自豪能与你们一起参与这段旅程。

要开始使用,或获取有关本视频中讨论的任何内容的更多信息,请务必访问我们的主页 go.dev。感谢你参加今年的 Google I/O 大会。我们迫不及待地想看看你今年以及未来几年用 Go 构建的成果。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}

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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 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