链接:https://play.golang.org/p/69I8PAuoAV
提取:
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")
}
printString(s)
到达大小写匹配case Stringer
部分时的函数调用。s
的类型*fakeString
不是Stringer
。为什么匹配Stringer
。
我做了一个fmt.Println(reflect.TypeOf(str))
,它确认类型为*main.fakeString
这是golang中的界面满意度。
golang中有两种类型:接口类型和具体类型。
concrete type
完全按照您的预期工作switch
:变量是给定类型的实例interface type
另一方面,它的工作方式不同,它检查变量是否满足接口要求。哼,满足吗?它是如何工作的?
如果(具体)类型拥有接口所需的所有方法,则它可以满足该接口。
-golang编程语言
在这种情况下,Stringer
是一个接口,仅声明一种方法:String() string
。并fakeString
通过自己的String() string
方法来满足它。
但是,需要注意两件事:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句