我有简单的 Go 代码:type MyInterface interface { Do()}type Doer struct{}func (d *Doer) Do() {}// Option 1var _ MyInterface = (*Doer)(nil)// Option 2var _ MyInterface = &Doer{}与选项 2 相比,使用选项 1(在任何地方都被广泛使用和建议)强制执行接口的缺点是什么?如果我们丢弃结果,实例化一个真实对象而不是指针有什么害处?我知道选项 2 可能慢了一毫秒,因为它为结构分配内存,而且 GC 可能还有一毫秒的时间来清理它,但所有这些都只在启动时发生,不会影响运行时。这些是我的正确还是我错过了什么?
1 回答

慕田峪4524236
TA贡献1875条经验 获得超5个赞
题主的分析很好。这里还有两点:
选项 1 适用于任何类型。选项 2 仅适用于具有复合文字语法的类型。
这是一个例子:
type IntDoer int
func (d *IntDoer) Do() {}
// Option 1
var _ MyInterface = (*IntDoer)(nil)
// Option 2 DOES NOT COMPILE
var _ MyInterface = &IntDoer{}
选项 2 可能没有任何运行时损失。编译器可能会优化分配。
- 1 回答
- 0 关注
- 107 浏览
添加回答
举报
0/150
提交
取消