
Go常见设计模式
设计模式是为了语言擦屁股。不同语言由于自身优劣不同,常见的设计模式及其实现有些小差别。 Go的思想是“组合优于继承”,不依托于复杂的类层次来实现多态,推荐使用Interface、高阶函数(行为参数化)、Goroutine/Channel 来实现各类设计模式。 策略模式 与大多数oop语言相同,go策略模式也依托于接口来实现。 在实际工程中,我们经常会搭配策略模式和简单工厂模式。对于不...

设计模式是为了语言擦屁股。不同语言由于自身优劣不同,常见的设计模式及其实现有些小差别。 Go的思想是“组合优于继承”,不依托于复杂的类层次来实现多态,推荐使用Interface、高阶函数(行为参数化)、Goroutine/Channel 来实现各类设计模式。 策略模式 与大多数oop语言相同,go策略模式也依托于接口来实现。 在实际工程中,我们经常会搭配策略模式和简单工厂模式。对于不...
这篇文稿讲什么 读完之后,你能搞清楚五种主流 ID 方案的内部结构(精确到每一个 bit),理解它们为什么这样设计,知道每种方案的性能边界和踩坑点,并且能在面试中把任何一个方案讲到第三层追问。 背景问题 在单机单表时代,MySQL 的 AUTO_INCREMENT(自增)够用了——数据库帮你管顺序,你什么都不用操心。 但当你面对这些问题时,自增就不够了: 多个数据库实例同...
这篇文章讲什么 用一篇文章把三个东西串起来讲清楚:IO 多路复用是什么、Epoll 为什么比 select/poll 强、Redis 怎么用这些机制做到单线程扛住几万并发连接。 读完你能回答:为什么 Redis 单线程还这么快?Epoll 到底快在哪?”IO 多路复用”里的”复用”到底复用了什么? 先搞清楚问题:一个服务端怎么同时跟多个客户端聊天? 写个最简单的 Echo 服务—...
要判断 Go 语言中变量是否会逃逸到堆上,核心思想是: 如果变量的生命周期超过其创建所在的函数栈帧生命周期; 或者编译器无法在编译期确定其安全分配在栈上,则会发生逃逸。 逃逸触发场景 1. 函数返回变量的指针或引用(最常见) 判断逻辑:函数返回局部变量的地址 → 变量生命周期需长于函数栈 → 必须逃逸到堆。 package main f...
传统IO 背景:传统IO场景下,服务器把磁盘文件网络IO发送给客户端Socket read(file_fd, user_buf, ...); // 读文件到用户缓冲区 write(sock_fd, user_buf, ...); // 从用户缓冲区写到网络 这个过程中会发生很多次内核用户态切换: read() 磁盘→内核缓存(DMA读入) DMA:Direc...
众所周知,Go不支持方法重载。我们如果想写一个 n -> n*n 的平方方法,最简单粗暴的方法就是针对不同的类型编写不同方法名但具有类似方法体的方法。 func SquareInt(n int) int{ return n*n } func SquareFloat(n float64) float64{ return n*n } 如果该场景只针对int\floa...
目标与原则 目标 分支职责清晰,避免混乱 提交记录可读、可追溯、可回滚 支持多人并行开发、快速发布与问题回溯 基本原则 一个分支只做一类事情 一个提交只解决一个问题 提交信息能“脱离上下文”被理解 永远不要直接在main/master/dev分支上开发 永远不要将dev分支的代码合并到自己的功能分支上 分支模型 主干分支(长...