我正在阅读Go的io包的源代码,我遇到了一个我不完全理解的片段。这是
func WriteString(w Writer, s string) (n int, err error) {
if sw, ok := w.(stringWriter); ok {
return sw.WriteString(s)
}
return w.Write([]byte(s))
}
,其中
type stringWriter interface {
WriteString(s string) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
类型断言w.(stringWriter)
断言w的动态类型(即Writer)实现了stringWriter接口。鉴于stringWriter和Writer的类型定义,我不知道这是如何可行的。假设这段代码是正确的,我错过了什么?
答案 0 :(得分:5)
您可以轻松构建一个实现Writer
以及stringWriter
:
type StringWriter struct{}
func (s StringWriter) Write(in []byte) (int, error) {
return 0, nil
}
func (s StringWriter) WriteString(s string) (int, error) {
return s.Write([]byte(s))
}
因此,将StringWriter
的实例传递给io.WriteString
会导致StringWriter.WriteString
被召唤。
io.WriteString
背后的逻辑是:如果有这样的方法,请在编写器上使用WriteString
或者回到string
到[]byte
转换。测试实例是否实现
方法与否,使用接口,因为这些只是方法集,可以轻松测试。