2

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

4

1 回答 1

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)) 
}

所以传递一个 to 的实例StringWriterio.WriteString导致StringWriter.WriteString 被调用。

背后的逻辑io.WriteString是:如果它有这样的方法,则在编写器上使用,否则WriteString回退到转换。为了测试实例是否实现了方法,使用了接口,因为这些只是方法集,可以很容易地进行测试。string[]byte

于 2013-06-14T10:14:08.107 回答