2 回答
TA贡献1900条经验 获得超5个赞
该值传递给Println作为interface{},并检查它是否满足fmt.Stringer通过一个接口“类型断言”通常以的形式“型开关”。
func IsStringer(i interface{}) {
switch s := i.(type) {
case fmt.Stringer:
fmt.Println("Person a has a String() method")
fmt.Println(s.String())
default:
fmt.Println("not a stringer")
}
// OR for a single type
if s, ok := i.(fmt.Stringer); ok {
fmt.Println("Person a has a String() method")
fmt.Println(s.String())
}
}
但是,从fmt包装中打印时,其他方法可能优先。首先检查fmt.Formatter, fmt.GoStringer, error, 最后检查fmt.Stringer。
TA贡献1827条经验 获得超4个赞
该fmt
包与它定义的接口工作,在这种情况下Stringer
。它不知道您定义的接口,因此String2()
即使您将满足该Stringer2
接口的类型传递给它,它也不知道调用。
接口是一种在类型之间具有共同行为的方式。因此,如果您创建一个函数Foo(s Stringer2)
,Foo 可以简单地调用s.String2()
确信传入它的任何内容都将具有该函数String2()
。
更深入一点,fmt.Println
获取interface{}
类型,然后使用反射来检查给定的参数是否满足Stringer
接口,然后调用String()
.
有道理?
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报