【问题标题】:Is this type assertion ever valid?这种类型断言是否有效?
【发布时间】:2013-06-14 18:22:01
【问题描述】:

我正在阅读 Go 的 io 包的源代码,但遇到了一个我不完全理解的 sn-p。在这里

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

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以轻松构建实现WriterstringWriter 的类型:

    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背后的逻辑是:如果有这样的方法,就在writer上使用WriteString 否则退回到string[]byte 的转换。测试实例是否实现 无论是否是方法,都会使用接口,因为这些只是方法集,可以轻松测试。

    【讨论】:

    • 如此明显,几乎令人尴尬。关键字前面太多时间让我忘记了func WriteString(w Writer) 将接受任何实现 Writer 接口的东西。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2021-01-09
    • 2014-09-21
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多