接口:用行为定义依赖
Go 的接口是一组方法签名。类型不需要显式声明“implements”;只要方法集满足接口,就自动实现。
type Writer interface {
Write([]byte) (int, error)
}
func writeGreeting(w Writer) error {
_, err := w.Write([]byte("hello\n"))
return err
}
这个函数依赖所需的最小行为,而不是某个具体文件、网络连接或缓冲区类型。测试时也可传入小型模拟实现。
接口应尽量小,并通常由使用者一侧定义。不要为了“面向接口”而为每个 struct 预先创建接口;当确实需要替换实现、隔离外部依赖或表达能力边界时再引入。
nil interface 的常见陷阱
接口值同时包含动态类型和值。一个带有 nil 指针的接口不等于 nil:
因此返回接口时,应避免把 nil 具体指针包装进接口。