

新闻资讯
技术学院Go接口通过约定、组合与隐式实现自然承载设计模式:io.Reader体现策略模式,嵌入接口实现装饰器,context.Context简化观察者,结构体直接实现多接口完成适配。
Go 语言本身没有类、继承或抽象类,但接口(interface{})是体现设计模式思想最自然、最轻量的载体。它不靠语法糖,而靠「约定 + 组合 + 隐式实现」来落地常见模式。
io.Reader 和 io.Writer 理解策略模式策略模式的核心是「封装可互换的算法」。Go 标准库的 io.Reader 就是典型:任何实现了 Read([]byte) (int, error) 方法的类型,都自动成为一种读取策略——文件、网络连接、内存字节切片、gzip 流,全都可以无缝替换。
实操建议:
Close() 到 Reader,那是 io.Closer 的事)json.NewDecoder(r io.Reader) 不关心 r 是来自磁盘还是 HTTP bodyGo 没有 extends,但你可以把一个接口字段嵌入结构体,再选择性地重写部分方法——这就是装饰器。比如 http.Transport 包裹底层连接,bufio.Reader 包裹另一个 io.Reader。
常见错误现象:直接复制原接口方法逻辑,却忘了调用被包装对象的对应方法,导致装饰失效。
实操建议:
reader io.Reader)r.reader.Read(...),仅在前后添加额外行为(日志、限速、重试)context.Context 是观察者模式的极简实现它不显式注册监听器,而是通过派生新 Context(如 WithCancel、WithTimeout)并传递给下游函数,让所有参与方「被动响应」取消信号。这比手动维护回调列表更符合 Go 的并发哲学。
使用场景:
ctx,下游 DB 查询、RPC 调用都基于它做超时控制Done() channel容易踩的坑:
context.Background() 或 context.TODO() 直接传进长期运行的 goroutine,导致无法取消context.Context,破坏统一信号源当第三方库返回一个结构体(如 net/http.Response),而你需要把它当作某个接口(如 io.ReadCloser)使用时,Go 不需要显式写 HttpToIoAdapter 类——因为 *http.Response 本身就实现了 io.ReadCloser(它同时满足 Read() 和 Close())。
实操建议:
io.ReadWriteCloser 是三个接口的组合)
类型断言 v, ok := x.(MyInterface) 是运行时适配检查,不是强制转换;失败时 ok == false,别忽略 ok
type A interface{ B } → type B interface{ C }),增加理解成本和 mock 难度Go 接口的价值不在语法多强大,而在它迫使你提前思考「谁用这个行为」「这个行为是否稳定」「要不要拆开」。很多设计模式的复杂性,在 Go 里被压缩成一行接口声明和一个方法签名——但这也意味着,一旦接口定型,修改成本极高。