Golang新手学习设计模式的正确路径
技术百科
P粉602998670
发布时间:2026-01-15
浏览: 次 Go设计模式重在接口契约与组合,而非继承和类图;标准库中io.Reader、http.HandlerFunc等体现策略与适配器思想;应先写真实需求再提炼抽象,避免过度设计。
设计模式不是 Go 语言的必需品,盲目套用反而会破坏 Go 的简洁性。Go 新手该先理解语言本身如何“自然表达意图”,再看哪些模式是被语言特性消解了、哪些是值得保留的变体。
先忘掉 UML 和“23 种模式”这个概念
Go 没有继承、没有抽象类、没有接口实现强制绑定,传统面向对象模式里的 FactoryMethod、TemplateMethod、AbstractFactory 大部分失去意义。强行翻译会导致代码臃肿、类型混乱。
- 别一上来就画类图——Go 关注的是
struct+func+interface三者如何协作 - 别背“某模式解决某问题”——先写一个真实小需求(比如读配置、发 HTTP 请求、管理连接池),再回头看看哪段逻辑重复、哪处耦合难测
- Go 标准库里几乎不出现模式名称,但处处是模式思想:比如
io.Reader是策略模式的极简实现,http.HandlerFunc是函数式适配器
从标准库和 net/http 中认出真模式
Go 的模式长在接口定义和组合方式里,不是靠继承树堆出来的。重点观察标准库怎么用 interface{} 和匿名字段做解耦。
-
io.Reader和io.WriteCloser是行为契约,任何满足签名的类型都能插拔——这就是策略模式的本质,不用Strategy类名也能成立 -
http.Handler接口只有ServeHTTP(http.ResponseWriter, *http.Request)一个方法,而http.HandlerFunc把函数转成满足该接口的类型——这是适配器模式,且只用一行转换:func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) } -
net/http.Server字段里嵌入Handler,又允许传入任意实现了该接口的值——这就是组合优于继承的直接体现,不是“装饰器模式”的教科书复刻,但效果一致
动手改写一个“过度设计”的例子
新手常写的“规范”代码,比如为日志加个 LoggerInterface 再搞个 NewFileLogger()、NewConsoleLogger() 工厂,其实远不如直接用 log.Logger + io.Writer 组合来得清晰。
- 删掉所有带
Factory、Manager、Context(非context.Context)后缀的包名和类型名 - 把“创建对象”的逻辑下沉到 main 或 cmd 层,业务层只依赖接口,比如
type Storer interface { Save(context.Context, []byte) error } - 用结构体字段直接持有依赖,而不是通过 setter 注入:
type Service struct { storer Storer cache Cache }—— 初始化时传进去,不提供修改入口
真正需要警惕的,是那些 Go 里“不存在但你硬要造”的东西
比如为每个实体写 xxxRepository 接口、搞一套 Usecase 层包装单个函数、用 errors.Wrap 堆叠 5 层调用栈——这些不是模式,是惯性思维的副产品。
- Go 的错误处理是值语义,
if err != nil就地处理或返回,不需要try/catch式的模板 - 并发原语(
goroutine+channel)天然支持生产者-消费者、管道等模式,不必套Observer或Mediator名称 - 如果某个“模式”让你多写了 3 个文件、5 个接口、2 层包装,却没让测试更容易写、逻辑更易替换、错误更易定位——那就不是 Go 的模式,只是 Java 的影子
最常被忽略的一点:Go 的设计模式,往往藏在接口定义的粒度里。一个方法的接口(如 io.Closer)比十个方法的接口(如 java.util.Collection)更符合 Go 哲学。别急着实现,先想清楚——这个抽象,到底要隔离什么变化?
# ai
# 的是
# 这是
# 那就
# 都能
# 也能
# 不需要
# 这就是
# 更易
# http
# go
# golang
# Error
# 并发
# 对象
# 堆
# java
# if
# 标准库
# 接口
# nil
# 栈
# Interface
# 结构体
# 继承
# Struct
# channel
# try
# catch
# 面向对象
# Collection
# uml
# 先写
# 如为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何提升Golang JSON序列化性能_Gola
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何使用Golang管理模块版本_Golanggo
- c++如何获取map中所有的键_C++遍历键值对提
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- php打包exe怎么传递参数_命令行参数接收方法【
- 如何诊断并终止卡死的 multiprocessin
- Win11局域网共享怎么设置 Win11文件夹网络
- Win11怎么开启专注模式_Windows11时钟
- Win11如何关闭小娜Cortana Win11禁
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- c++的static关键字有什么用 静态变量和静态
- Mac如何将HEIC图片格式转为JPG_Mac批量
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何使用Golang实现Web表单数据绑定_自动映
- Go 语言标准库为何不提供泛型切片的 Contai
- Win11怎么关闭通知消息_屏蔽Windows 1
- Win11时间不对怎么同步_Win11自动校准互联
- Win10系统怎么查看端口状态_Windows10
- 如何在Golang中写入JSON文件_保存结构体数
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Win11怎么关闭OneDrive同步_Win11
- 如何使用Golang指针与结构体结合_修改结构体内
- 如何在 Pandas 中按元素交集合并两列字符串
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Win11怎么关闭透明效果_Windows11辅助
- 如何在Golang中捕获结构体方法错误_Golan
- Win11怎么查看激活状态_查询Windows 1
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何使用Golang encoding/json解
- Windows10蓝屏SYSTEM_SERVICE
- Win11怎么设置虚拟内存_Windows 11优
- c++的位运算怎么用 与、或、异或、移位操作详解【
- Win11怎么恢复出厂设置_Win11重置此电脑保
- Win11如何设置省电模式 Win11开启电池节电
- Windows10电脑怎么查看硬盘通电时间_Win
- Windows10系统更新错误0x80070002
- Linux怎么实现内网穿透_Linux安装Frp客
- Windows7怎么找回经典开始菜单_Window
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- c++ reinterpret_cast怎么用 c
- Win10系统怎么查看网络连接状态_Windows
- C++如何将C风格字符串(char*)转换为std
- PythonPandas数据分析项目教程_时间序列
- Windows10怎么查看硬件信息_Windows
- Windows怎样关闭开始菜单推荐广告_Windo
- php嵌入式日志记录怎么实现_php将硬件数据写入
- Windows系统被恶意软件破坏后的恢复策略_错误
- Win11快速助手怎么用_Win11远程协助连接教
- Windows服务启动类型恢复方法_错误修改导致的


QQ客服