外观
接口、方法集与 nil
- 状态:未准备
- 适用方向:Go 全栈 / Go 后端
- 最近复习:待填写
- 下次复习:待安排
一句话回答
接口描述行为并由类型隐式实现;接口为 nil 必须既没有动态类型也没有动态值,装着 nil 指针的接口通常不等于 nil。
原理解释
T 的方法集包含接收者为 T 的方法,*T 还包含接收者为 *T 的方法。可寻址变量调用指针接收者方法时可自动取地址,但不代表 T 实现了要求该方法的接口。
go
type Problem struct{}
func (*Problem) Error() string { return "problem" }
func check() error {
var p *Problem
return p // 返回的 error != nil,无错误时应直接 return nil。
}v, ok := x.(T) 安全判断动态类型;不带 ok 且失败会 panic。接口尽量小,由消费方按需定义。any 是空接口别名,不会让值失去动态类型。
场景与边界
provider、存储等边界适合接口;不必为每个结构体机械建接口。泛型用于编译期类型参数复用,接口用于行为抽象,两者可以配合。
项目中的应用
沿 SimulSpeak AI provider核对适配接口、mock 与真实实现,并检查 typed nil 错误返回。
常见追问
- nil 指针能调用方法吗? 可以进入指针接收者方法,解引用 nil 则 panic,由实现决定能否处理。
- 接口比较一定安全吗? 相同动态类型的值若不可比较,比较可能 panic;与 nil 比较可用。
- 编译期检查接口实现? 可用
var _ io.Reader = (*MyReader)(nil)。