接口(interface)是 Go 面向对象与多态的基石,也是「组合优于继承」哲学的直接体现。它没有 Java 的 implements 关键字,而是靠隐式实现把类型和契约解耦。
1. error 接口 Go 没有 try/catch/finally 这类异常机制,而是把错误当作普通的返回值来处理。函数把错误作为最后一个返回值交给调用方,调用方显式判断并处理。这是 Go 错误处理
1. 进程、线程与协程 要理解 goroutine 为什么"轻",先要弄清它在整个并发抽象体系里所处的位置。从操作系统到语言运行时,并发执行单元大
goroutine 是 Go 并发的执行单元,而 channel 则是 goroutine 之间通信与同步的"管道"。理解 channel 的底层 hchan 结构、发送/接收的阻塞与唤醒机制、关闭规则以及 select 多路复用原理,是写出正确、高效并发程序的前提。本章从 CSP 模型讲起,一直深入到运行时源码级别的实现。
Go 的并发哲学是「不要通过共享内存来通信,而要通过通信来共享内存」。channel 是首选,但当我们确实需要共享状态时,sync 与 sync/atomic 包提供的并发
在真实的服务端程序里,一个请求往往会衍生出成百上千个 goroutine:查数据库、调下游 RPC、读缓存、写日志……如果客户端断开连接,或者请
反射(reflection)是 Go 在运行时检查、修改自身结构的能力。它让程序可以脱离编译期已知的具体类型,动态地读取字段、调用方法、构造实例。
泛型(Generics)是 Go 语言发展史上最重要的一次语法扩展。从 2009 年开源到 2022 年 Go 1.18 正式落地,社区对泛型的讨论整整持续了十三年。它让我们终于可
内存管理是理解 Go 运行时的最后一块拼图,也是面试中区分"会用"与"懂原理"的分水岭。Go 把 C/C++ 里让人头疼
1. 性能分析概述 性能优化是每个后端工程师绕不开的话题。但在动手之前,请牢记三条准则: 先测量,再优化:不要凭直觉猜测瓶颈在哪里。人类对性能瓶颈的
1. Go 的测试哲学 一门语言是否「工程友好」,很大程度上取决于它对测试的态度。Go 的选择是:把测试做成语言与工具链的一等公民,而不是交给第三方框架
Gin 是 Go 生态里最流行的 Web 框架之一,r.GET("/ping", handler) 一行代码就能跑起一个服务。但它并不是重新发明了一套网络模型
1. RPC 是什么 RPC 是远程过程调用(Remote Procedure Call)的缩写,是分布式系统中不同节点间流行的通信方式。它的核心目标是:让调用远程服务像调用本地
1. 为什么不用标准库 log 标准库 log 包足够简单,log.Println 开箱即用,但一旦项目走向生产环境,它的短板就会暴露: 能力 标准库 log 工程需求 日志分
1. 从一个问题说起 服务要发新版本,最粗暴的做法是 kill 掉旧进程再启动新的。但这中间存在一个空窗期: 进程被杀,正在处理的请求被硬生生中断,客户端收到
1. 三种读文件的姿势 Go 里读一个文件,主流有三种写法,它们的差异不在「能不能读」,而在一次读多少、要不要缓冲、内存占用多大: os 包直接读:os.O
1. Redis 是什么 Redis(REmote DIctionary Server,远程字典服务)是一个用 ANSI C 编写的开源、基于内存的键值型数据库,由意大利人 Salvatore Sanfilip
1. 通用 key 操作 在讲具体类型之前,先掌握与类型无关的 key 级操作。 1.1 存在性与删除 EXISTS key [key ...] # 返回存在的 key 个数(可以传多个,重复的 key 会重复计数) DEL key [key ...]
1. 概览 除了五种基本类型,Redis 还提供了几种"高级类型"。要理解的关键是:它们中大部分不是新的底层数据结构,而是建立在
1. 从对象到编码:Redis 的两层抽象 Redis 并不是"一种类型对应一种数据结构",而是设计了两层抽象: 对外的类型(type):s