在Go中,你没有声明你需要实现一个接口,你只是这样做(它被称为'结构类型',类似于动态语言中的'duck typing')。 如果要强制类型实现接口(例如,在继承C#或Java中的接口时),该怎么办?换句话说,如果忘记实现接口(或者使签名错误)会是一个错误,并且您希望尽早发现错误。最好的方法是什么?
答案 0 :(得分:2)
您可能做的最好的事情是尝试将类型的实例分配给接口变量
例如,您希望确保A
类型实现Stringer
接口。
你可以这样做
var _ Stringer = new(A) //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
答案 1 :(得分:0)
完成@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)