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 可能还有一毫秒的时间来清理它,但所有这些都只在启动时发生,不会影响运行时。


这些是我的正确还是我错过了什么?


慕虎7371278
浏览 108回答 1
1回答

慕田峪4524236

题主的分析很好。这里还有两点:选项 1 适用于任何类型。选项 2 仅适用于具有复合文字语法的类型。这是一个例子:type IntDoer intfunc (d *IntDoer) Do() {}// Option 1var _ MyInterface = (*IntDoer)(nil)// Option 2 DOES NOT COMPILEvar _ MyInterface = &IntDoer{} 选项 2 可能没有任何运行时损失。编译器可能会优化分配。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go