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 关注
- 238 浏览
添加回答
举报
