文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
interface 函数参数
interface 的变量可以持有任意实现该 interface 类型的对象,这给编写函数(包括 method) 提供了一些额外的思考,是不是可以通过定义 interface 参数,让函数接受各种类型的参数。
举个例子:fmt.Println 是常用的一个函数,是否注意到它可以接受任意类型的数据。打开 fmt 的源码文件,会看到这样一个定义:
type Stringer interface {
String() string
}
也就是说,任何实现了 String 方法的类型都能作为参数被 fmt.Println
调用,来试一试
package main
import (
"fmt"
"strconv"
)
type Human struct {
name string
age int
phone string
}
// 通过这个方法 Human 实现了 fmt.Stringer
func (h Human) String() string {
return "❰"+h.name+" - "+strconv.Itoa(h.age)+" years - ✆ " +h.phone+"❱"
}
func main() {
Bob := Human{"Bob", 39, "000-7777-XXX"}
fmt.Println("This Human is : ", Bob)
}
现在再回顾一下前面的 Box 示例,发现 Color 结构也定义了一个 method:String
。其实这也是实现了 fmt.Stringer
这个 interface
,即如果需要某个类型能被 fmt 包以特殊的格式输出,就必须实现 Stringer
这个接口。如果没有实现这个接口,fmt 将以默认的方式输出。
//实现同样的功能
fmt.Println("The biggest one is", boxes.BiggestsColor().String())
fmt.Println("The biggest one is", boxes.BiggestsColor())
注:实现了 error
接口的对象(即实现了 Error() string 的对象),使用 fmt 输出时,会调用 Error() 方法,因此不必再定义 String() 方法了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论