在Go中,你不需要声明你需要实现一个接口,你只需要做(这被称为“结构类型”,类似于动态语言中的“鸭子类型”)。 如果您想强制类型实现接口(例如,当您在 C# 或 Java 中“继承”接口时)怎么办?换句话说,如果忘记实现接口(或签名错误)是一个错误,并且您希望尽早发现该错误,该怎么办?最好的方法是什么?
您可以做的最好的事情就是尝试将类型的实例分配给接口变量
例如,您想确保类型
A
实现 Stringer
接口。
你可以这样做
var _ Stringer = (*A)(nil) //or
var _ Stringer = A{}
这里是示例程序,在示例中
A
实现了接口,而B
没有实现
package main
import (
"fmt"
)
type Stringer interface {
String() string
}
type A struct {
}
func (a A) String() string {
return "A"
}
type B struct {}
var _ Stringer = new(A)
var _ Stringer = new(B)
func main() {
fmt.Println("Hello, playground")
}
播放链接在这里:play.golang
完成@Sarathsp 所说的话: 基本上,通过声明接口类型的虚拟变量(下划线表示未使用它),同时将类型的实例分配给它,您会得到非常明确的编译时错误:
type MyType struct {
}
func (*MyType) Read() {
}
var _ io.Reader = &MyType{}
cannot use MyType literal (type *MyType) as type io.Reader in assignment:
*MyType does not implement io.Reader (missing Read method)
Or
cannot use MyType literal (type *MyType) as type io.Reader in assignment:
*MyType does not implement io.Reader (wrong type for Read method)
have Read()
want Read([]byte) (int, error)