这种类型的断言是否有效?

时间:2013-06-14 09:29:18

标签: go

我正在阅读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的类型定义,我不知道这是如何可行的。假设这段代码是正确的,我错过了什么?

1 个答案:

答案 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转换。测试实例是否实现 方法与否,使用接口,因为这些只是方法集,可以轻松测试。