当前位置: 首页 > article >正文

【go语言规范】Gopherfest 2015 | Go Proverbs with Rob Pike的 总结

根据 Gopherfest 2015 | Go Proverbs with Rob Pike 的演讲,总结内容如下:
虽然已是十年前的产物,但是proverbs的价值依旧存在

以下是整合补充内容后的完整总结,涵盖 Rob Pike 在 Gopherfest 2015 演讲 “Go Proverbs” 中的核心观点:


1. 并发与通信

  • “Don’t communicate by sharing memory; share memory by communicating.”
    通过 channel 实现协程间通信,而非依赖共享内存和锁,减少竞态条件风险。
  • “Concurrency is not parallelism.”
    并发是代码结构设计(多协程协作),并行是物理执行(多核运行)。Go 的并发模型为并行提供基础,但需合理设计。
  • “Channels orchestrate; mutexes serialize.”
    Channel 用于协调协程流程,互斥锁(mutex)用于串行化临界区访问。优先使用 channel 实现逻辑编排。

2. 简洁性与接口设计

  • “The bigger the interface, the weaker the abstraction.”
    接口应小而专注,避免过度复杂化。通过组合小接口实现灵活功能。
  • “interface{} says nothing.”
    空接口(interface{})缺乏类型信息,滥用会破坏类型安全。应优先使用具体类型或明确定义的接口。

3. 错误处理

  • “Errors are values.”
    错误是普通值,需显式处理而非依赖异常机制。
  • “Don’t just check errors, handle them gracefully.”
    不仅要检查错误,还需优雅处理(如添加上下文、重试或降级),避免简单忽略或仅打印日志。

4. 代码可读性与实践

  • “Clear is better than clever.”
    代码清晰性优先于复杂技巧,避免过度优化。
  • “Reflection is never clear.”
    反射(reflect 包)增加代码复杂度,应谨慎使用,优先选择静态类型方案。

5. 工具链与工程实践

  • “Gofmt’s style is no one’s favorite, yet gofmt is everyone’s favorite.”
    统一格式化工具(gofmt)消除代码风格争议,提升协作效率。
  • “A little copying is better than a little dependency.”
    谨慎引入第三方依赖,必要时复制少量代码更可控。

6. 类型与零值设计

  • “Make the zero value useful.”
    类型的零值(如 nil、空结构体)应具备合理默认行为,减少冗余初始化代码。

7. 系统交互与跨平台

  • “Syscall must always be guarded with build tags.”
    系统调用(syscall)需通过构建标签(build tags)限定平台,避免跨平台编译错误。
  • “Cgo must always be guarded with build tags.”
    使用 Cgo 时需用构建标签隔离平台相关代码。
  • “Cgo is not Go.”
    Cgo 破坏了 Go 的跨平台性和内存安全,应尽量避免使用。
  • “With the unsafe package there are no guarantees.”
    unsafe 包绕过类型系统,可能导致未定义行为,仅在必要时谨慎使用。

8. 文档与设计原则

  • “Design the architecture, name the components, document the details.”
    设计需明确架构、组件命名和细节文档,保持代码结构清晰。
  • “Documentation is for users.”
    文档应面向使用者,解释“做什么”而非“如何实现”,提升易用性。

总结

这些格言从并发模型、代码风格、错误处理到系统交互,全面体现了 Go 语言的设计哲学:简洁、务实、注重工程实践。Rob Pike 通过强调“少即是多”(Less is exponentially more),倡导开发者避免过度设计,优先选择简单、可维护的方案。这些原则不仅是 Go 语言的基石,也对其他编程场景具有普适指导意义。



新的问题: 十年过后,依旧有效吗?


十年过去,Rob Pike 在 Gopherfest 2015 提出的 Go Proverbs 仍然是 Go 语言社区的核心指导原则,但其适用性在部分场景下因语言演进和工程实践的发展而有了更丰富的解读。以下是逐条分析:


1. 并发与通信

  • “Don’t communicate by sharing memory; share memory by communicating.”
    依旧有效。Go 的并发模型仍以 channel 为核心,但实践中会根据场景混合使用 channel 和互斥锁(如 sync.Mutex)。社区共识是:优先用 channel 协调协程,用锁保护临界区
  • “Concurrency is not parallelism.”
    有效。并发设计(多协程协作)与并行执行(多核运行)的区分仍是关键,尤其在云原生和分布式系统中,协程的轻量级特性被广泛应用(如 Kubernetes、微服务框架)。

2. 接口与抽象

  • “The bigger the interface, the weaker the abstraction.”
    有效,但泛型引入后有所调整。Go 1.18 泛型的加入减少了对大型接口的依赖(如不再需要 interface{} 实现通用容器),但小接口组合的思想仍是主流。
  • “interface{} says nothing.”
    部分弱化。泛型(类型参数)替代了部分 interface{} 的使用场景,但空接口在反射、序列化等场景中仍有必要,需谨慎使用。

3. 错误处理

  • “Errors are values.”“Don’t just check errors, handle them gracefully.”
    有效,但实践更成熟。社区提出了错误包装(fmt.Errorf("%w", err))、错误链检查(errors.Is/As)等模式,并涌现了 pkg/errors 等库,强调错误上下文和可追溯性。

4. 代码可读性与工具链

  • “Clear is better than clever.”
    有效且更受重视。随着 Go 在大型企业项目中的普及,可维护性成为关键,过度“炫技”的代码会被视为反模式。
  • “Gofmt’s style is no one’s favorite, yet gofmt is everyone’s favorite.”
    依然成立gofmt 的强制性格式化已成为 Go 生态的标志性实践,甚至影响了其他语言(如 Rust 的 rustfmt)。

5. 依赖与复用

  • “A little copying is better than a little dependency.”
    争议中演进。Go Module 的成熟让依赖管理更安全,但社区仍警惕“依赖爆炸”(如 Log4j 事件后)。适度复制小代码片段 vs 引入稳定库,需权衡维护成本与安全性。

6. 系统交互与底层操作

  • “Cgo is not Go.”“With the unsafe package there are no guarantees.”
    依然有效。Cgo 和 unsafe 的使用仍被视为“最后手段”,但在高性能场景(如数据库驱动、序列化库)中不可避免。社区更倾向于通过纯 Go 实现替代方案(如 io_uring 库)。
  • Syscall/Cgo 的构建标签守卫
    必要但工具改进。Go 的跨平台支持更完善(如 GOOS/GOARCH),但构建标签(//go:build)仍是隔离平台代码的标准方式。

7. 零值与反射

  • “Make the zero value useful.”
    有效。例如 sync.Mutex 的零值可直接使用,context.Context 的默认行为等,这一原则减少了冗余初始化代码。
  • “Reflection is never clear.”
    有效但更可控。反射在序列化(如 JSON)、ORM 框架中广泛使用,但社区倡导通过代码生成(如 go generate)或泛型减少运行时反射。

8. 设计与文档

  • “Design the architecture, name the components, document the details.”
    有效且重要性提升。随着微服务和分布式系统的普及,清晰的架构设计和文档(如 GoDoc)成为团队协作的基石。
  • “Documentation is for users.”
    有效。Go 的文档工具链(如 GoDoc)和示例(ExampleXxx 函数)仍是开发者体验的核心部分。

总结:变与不变

  • 不变的核心:大多数 Proverbs 反映了 Go 的设计哲学(简洁、显式、组合、工程友好),这些原则仍是语言基因的一部分。
  • 演进与补充
    • 泛型的引入减少了对 interface{} 和反射的依赖,但未颠覆接口设计原则。
    • 错误处理、依赖管理等实践更成熟,但核心理念未变。
    • 工具链(Go Module、gopls)的进步让部分原则(如构建标签)更易落地。

十年后,Go Proverbs 不仅是历史经验,更是持续演进的实践指南。它们为 Go 开发者提供了避免复杂性的“免疫系统”,但在具体场景中需结合新技术(如泛型、WASM)灵活应用。

相关文章:

【go语言规范】Gopherfest 2015 | Go Proverbs with Rob Pike的 总结

根据 Gopherfest 2015 | Go Proverbs with Rob Pike 的演讲,总结内容如下: 虽然已是十年前的产物,但是proverbs的价值依旧存在 以下是整合补充内容后的完整总结,涵盖 Rob Pike 在 Gopherfest 2015 演讲 “Go Proverbs” 中的核心…...

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...

内容中台驱动企业数字化内容管理高效协同架构

内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...

【第14章:神经符号集成与可解释AI—14.4 神经符号集成与可解释AI的未来发展趋势与挑战】

想象一下,如果AI既能像人类一样直觉感知(比如一眼认出街角的咖啡店),又能像数学家一样逻辑推理(比如计算最优路线避开拥堵),这个世界会变成什么样?这种“双脑协同”正是神经符号集成技术的终极目标。 但现实是,当前99%的AI系统要么只会“死记硬背”数据(如深度学习模…...

[JVM篇]虚拟机性能监控、故障处理工具

虚拟机性能监控、故障处理工具 基础故障处理工具 jps(JVM Peocess Status Tool - 虚拟机进程状况工具) jstat(JVM Statistics Monitoring Too - 虚拟机统计信息监视工具) jinfo( Configuration info for Java - Java配置信息工具) jmap(Memory Map for…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_t 类型

ngx_cycle_t 定义在 src/core/ngx_core.h typedef struct ngx_cycle_s ngx_cycle_t; ngx_cycle_s 定义在 src/core/ngx_cycle.h struct ngx_cycle_s {void ****conf_ctx;ngx_pool_t *pool;ngx_log_t *log;ngx_log_t …...

WHERE子句中的条件

在SQL查询中,WHERE子句用于指定筛选条件,以限制从数据库表中检索出的数据行。WHERE子句通常位于SELECT、UPDATE、DELETE等SQL语句中,紧跟在FROM子句(对于SELECT语句)或其他相关子句之后。 一、WHERE子句的基本语法 sq…...

Effective Objective-C 2.0 读书笔记——内存管理(下)

Effective Objective-C 2.0 读书笔记——内存管理(下) 在 dealloc 方法中只释放引用并解除监听 对象在经历其生命期后 ,最终会为系统所回收 ,这时就要执行dealloc 方法了。 在每个对象的生命期内,此方法仅执行一次&a…...

[Spring Boot] Expense API 实现

[Spring Boot] Expense API 实现 项目地址:expense-api 项目简介 最近跟着视频做的一个 spring boot 的项目,包含了比较简单的记账功能的实现(只限 API 部分),具体实现的功能有: 记账(expen…...

Pell数列【一本通在线评测】

目录 描述 输入描述 输出描述 用例输入 1 用例输出 1 什么是pell数列 一、定义与递推关系 二、数学性质 三、应用领域 四、编程实现要点 五、扩展与相关概念 C代码实现 描述 Pell数列a1​,a2​,a3​,...的定义是这样的,a1​1,a2​2,...,an​2an−1​a…...

linux ollama deepseek等大语言模型的model文件的存储目录

linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的,模型数据存放在: /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录,则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...

【PyQt】工具栏(QToolBar)与动作按钮(QAction)使用指南

PyQt工具栏(QToolBar)与动作按钮(QAction)使用指南 🛠️ 一、基础用法示例 🌟 class MainWindow(QMainWindow):def __init__(self):super().__init__()# 创建工具栏 🔧self.toolbar self.addToolBar("主工具栏")# 创建动作集合 …...

软路由折腾 | OpenWrt安装后基础配置指南:联网设置与DNS优化

在PVE中安装OpenWrt教程 一、网络基础配置 1. 确认网络接口角色 OpenWrt旁路由通常仅需配置LAN口,无需WAN口。其流量通过主路由转发,因此需确保: 物理连接:OpenWrt的LAN口(如eth0)桥接到主路由的局域网&…...

设置默认构建变体 Build Variant

Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…...

【大模型】DeepSeek使用与原理解析:从V3到R1

文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力&#xff…...

DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类

学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…...

oracle 19c安装DBRU补丁时报错CheckSystemSpace的处理

oracle 19c的补丁目前已经发布到19.26版本了,数据库补丁安装也是数据库运维中的一个常见工作;近期在一个安装补丁的环境遇到了Prerequisite check "CheckSystemSpace" failed.错误,看起来是磁盘剩余空间不足的告警;按以…...

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…...

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…...

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…...

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…...

LangChain大模型应用开发:提示词工程应用与实践

介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是LangChain提示词工程应用与实践。 在如今火热的大语言模型应用领域里,LangChain可是一个相当强大且实用的工具。而其中的提示词(Prompt),更是我们与语言模型进行有效沟通的关…...

【数据结构入门 65 题】目录

目录 1 函数题2 编程题3 数据结构实现 1 函数题 6-1 单链表逆转 6-2~6-6 线性表基本操作 6-7 在一个数组中实现两个堆栈 6-8 求二叉树高度 6-9 二叉树的遍历 6-10 二分查找 6-11 先序输出叶结点 6-12 二叉搜索树的操作集 2 编程题 3 数据结构实现 栈和队列...

osgearth控件显示中文(八)

当前自己知道的方法大概有以下两种: (一)直接转成utf8 其实在前面的文章中已经有了。 osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(GeoPoint(geoSRS, 110, 34), String2UTF8("中国"), style);std::wstring String2Wstring(con…...

2025 N1CTF crypto 复现

近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…...

Windows Defender Control--禁用Windows安全中心

Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#...

mount 出现 2038 问题

在 linux 上挂载 ext4 文件系统时出现了 2038 年问题,如下: [ 236.388500] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 236.388560] ext4 filesystem being mounted at /root/tmp supports timestamps until 2…...

langchain+不同模型api使用教程

目录 一、Langchainopenai1. gpt-4o2. o13. o3-mini 二、Anthropic1.claude-3-5-sonnet-latest 三、四、 一、Langchainopenai langchain_community 可能是一个较旧的库,或者它的版本与 OpenAI 的最新 API 不兼容。OpenAI 的 API 可能会更新,而 langcha…...

【第12章:深度学习与伦理、隐私—12.4 深度学习与伦理、隐私领域的未来挑战与应对策略】

凌晨三点的自动驾驶测试场,AI系统突然在暴雨中做出惊人决策——它选择撞向隔离带而不是紧急变道,因为算法推演发现隔离带后的应急车道站着五个工程师。这个惊悚的伦理困境,揭开了深度学习伦理危机最尖锐的冰山一角。 一、潘多拉魔盒已开:深度学习伦理的四大原罪 1.1 数据原…...

2. 图片性能优化

图片性能优化 图片懒加载 如何判断图片出现在了当前视口 &#xff08;即如何判断我们能够看到图片&#xff09;如何控制图片的加载 原生实现 <img src"shanyue.jpg" loading"lazy" />loading"lazy" 延迟加载图像&#xff0c;直到它和视…...