Go - 如何明确声明一个结构正在实现一个接口?
Go - how to explicitly state that a structure is implementing an interface?
由于 Go 非常重视接口,我想知道我如何明确声明一个结构正在实现一个接口,以便在某些方法丢失的情况下清晰和错误检查?到目前为止,我已经看到了两种方法,我想知道哪种方法是正确的并且符合 Go 规范。
方法 1 - 匿名字段
type Foo interface{
Foo()
}
type Bar struct {
Foo
}
func (b *Bar)Foo() {
}
方法 2 - 显式转换
type Foo interface{
Foo()
}
type Bar struct {
}
func (b *Bar)Foo() {
}
var _ Foo = (*Bar)(nil)
这些方法是否正确,或者有其他方法可以做这样的事情吗?
你不能。在 Go 中,所有接口实现都是隐式的。您可以检查一个类型是否实现了一个接口(这是它获得的最明确的接口)。如果我没记错的话,在我从事的一个项目中,我们只是在包的顶部针对该类型实现的接口做了一些类型断言,这是尽可能接近显式的。
方法 2 是正确的方法,方法 1 您只是嵌入了一个类型并覆盖了它的功能。如果你忘记覆盖它,你将得到一个 nil 指针解引用。
我很少需要声明它,因为我的包中几乎总是在某个地方使用结构作为接口。我倾向于遵循尽可能不公开我的结构的模式,并且仅通过 "constructor" 函数提供它们。
type Foo interface{
Foo()
}
type bar struct {}
func (b *bar)Foo() {}
func NewBar() Foo{
return &bar{}
}
如果bar
不满足Foo
,则编译不通过。我没有添加构造来声明该类型实现了接口,而是确保 my 代码在某些时候将它用作接口。
由于 Go 非常重视接口,我想知道我如何明确声明一个结构正在实现一个接口,以便在某些方法丢失的情况下清晰和错误检查?到目前为止,我已经看到了两种方法,我想知道哪种方法是正确的并且符合 Go 规范。
方法 1 - 匿名字段
type Foo interface{
Foo()
}
type Bar struct {
Foo
}
func (b *Bar)Foo() {
}
方法 2 - 显式转换
type Foo interface{
Foo()
}
type Bar struct {
}
func (b *Bar)Foo() {
}
var _ Foo = (*Bar)(nil)
这些方法是否正确,或者有其他方法可以做这样的事情吗?
你不能。在 Go 中,所有接口实现都是隐式的。您可以检查一个类型是否实现了一个接口(这是它获得的最明确的接口)。如果我没记错的话,在我从事的一个项目中,我们只是在包的顶部针对该类型实现的接口做了一些类型断言,这是尽可能接近显式的。
方法 2 是正确的方法,方法 1 您只是嵌入了一个类型并覆盖了它的功能。如果你忘记覆盖它,你将得到一个 nil 指针解引用。
我很少需要声明它,因为我的包中几乎总是在某个地方使用结构作为接口。我倾向于遵循尽可能不公开我的结构的模式,并且仅通过 "constructor" 函数提供它们。
type Foo interface{
Foo()
}
type bar struct {}
func (b *bar)Foo() {}
func NewBar() Foo{
return &bar{}
}
如果bar
不满足Foo
,则编译不通过。我没有添加构造来声明该类型实现了接口,而是确保 my 代码在某些时候将它用作接口。