Go中的接口实现强制

Interface implementation enforcement in Go

我有简单的 Go 代码:

type MyInterface interface {
    Do()
}

type Doer struct{}

func (d *Doer) Do() {}

// Option 1
var _ MyInterface = (*Doer)(nil)

// Option 2
var _ MyInterface = &Doer{}

与选项 2 相比,使用选项 1(被广泛使用和推荐)强制执行接口有什么缺点?

如果我们要丢弃结果,实例化一个真实的对象而不是指针有什么危害?

我知道选项 2 可能慢一毫秒,因为它为结构分配内存,而且 GC 可能还需要一毫秒来清理它,但所有这些都只在启动时发生,不会发生影响运行时间。

我说的对吗?还是我漏掉了什么?

题中分析的很好。这里还有两点:

选项 1 适用于任何类型。选项 2 仅适用于具有复合文字语法的类型。

这是一个例子:

type IntDoer int

func (d *IntDoer) Do() {}

// Option 1
var _ MyInterface = (*IntDoer)(nil)

// Option 2 DOES NOT COMPILE
var _ MyInterface = &IntDoer{} 

选项 2 可能没有任何运行时惩罚。编译器可能优化了分配。