确认某类型已实现某接口

在Go中,接口是被隐式实现的,您不需要显式声明某类型要实现某接口。

这很方便,但当我们没有完全实现某接口时,编译器没法检查出这种错误。

这有一种方法可以进行编译类型检查:

type MyReadCloser struct {
}

func (rc *MyReadCloser) Read(d []byte) (int, error) {
	return 0, nil
}

var _ io.ReadCloser = &MyReadCloser{}

编译上述代码会报出如下错误:

./prog.go:15:5: cannot use &MyReadCloser literal (type *MyReadCloser) as type io.ReadCloser in assignment:
	*MyReadCloser does not implement io.ReadCloser (missing Close method)

我们打算让MyReadCloser结构体实现io.ReadCloser接口。但是,我们忘记了实现Close方法。

下面这行代码会在编译时就发现问题:

var _ io.ReadCloser = &MyReadCloser{}

我们打算把*MyReadCloser类型的值赋值给io.ReadCloser类型的变量。

因为*MyReadCloser类型并没有实现Close方法,编译器就会在编译时发现无效的赋值操作。

我们把值赋给空白标识符(blank identifier) _ ,是因为我们不会用这个变量做任何事情。

最后更新于