这篇文章是关于一个鲜为人知的让 Go 在编译期断言的方法。你可能不会使用它,但是了解一下也很有趣。
作为一个热身,来看一个在 Go 中熟知的编译期断言:接口满意度检查。
在这段代码(playground)中,var _ =
行确保类型 W
是一个 stringWriter
,其由 io.WriteString
检查。
package main
import "io"
type W struct{}
func (w W) Write(b []byte) (int, error) { return len(b), nil }
func (w W) WriteString(s string) (int, error) { return len(s), nil }
type stringWriter interface {
WriteString(string) (int, error)
}
var _ stringWriter = W{}
func main() {
var w W
io.WriteString(w, "very long string")
}
如果你注释掉了 W
的 WriteString
方法,代码将无法编译:
main.go:14: cannot use W literal (type W) as type stringWriter in assignment:
W does not implement stringWriter (missing WriteString method)
这是很有用的。对于大多数同时满足 io.Writer
和 stringWriter
的类型,如果你删除 WriteString
方法,一切都会像以前一样继续工作,但性能较差。
你可以使用编译期断言保护你的代码,而不是试图使用`testing.T.AllocsPerRun’为性能回归编写一个脆弱的测试。
via: http://commaok.xyz/post/compile-time-assertions
作者:Josh Bleecher Snyder 译者:geekpi 校对:wxy
发表回复