用接口去类型断言不明白它是怎么回事

时间:2017-03-30 18:46:33

标签: go interface type-assertion

我正在阅读“Go Bootcamp”,第3章第20页有一个例子我无法理解。在这个例子中,在printString(s)行中,s是fakeString类型的变量,但是在开关中,输入“Stringer”的情况。我试图了解这是如何可能的。任何帮助,将不胜感激。

代码是:

package main
import "fmt"

type Stringer interface {
   String() string
}
type fakeString struct {
   content string
}
// function used to implement the Stringer interface
func (s *fakeString) String() string {
    return s.content
}
func printString(value interface{}) {
    switch str := value.(type) {
        case string:
            fmt.Println(str)
        case Stringer:
            fmt.Println(str.String())
    }
}
func main() {
    s := &fakeString{"Ceci n'est pas un string"}
    printString(s)
    printString("Hello, Gophers")
}

1 个答案:

答案 0 :(得分:0)

因为fakeString是一个与字符串不同的类型,但它实现了Stringer接口。具有给定函数的每个类型都实现该类型。 fakeString包含String()函数,因此它也实现了Stringer接口。这是Go的一些基本原因。

检查Reader接口的内置库,通常以此为例进行说明。