返回介绍

interface 函数参数

发布于 2024-10-12 12:35:55 字数 1274 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文