为了账号安全,请及时绑定邮箱和手机立即绑定

围棋之旅:了解纵梁练习

围棋之旅:了解纵梁练习

Go
芜湖不芜 2022-07-25 11:24:33
我在纵梁上做这个练习。问题:使IPAddr类型实现fmt.Stringer将地址打印为虚线四边形。例如,IPAddr{1, 2, 3, 4}应该打印为"1.2.3.4".起始代码:package mainimport "fmt"type IPAddr [4]byte// TODO: Add a "String() string" method to IPAddr.func main() {    hosts := map[string]IPAddr{        "loopback":  {127, 0, 0, 1},        "googleDNS": {8, 8, 8, 8},    }    for name, ip := range hosts {        fmt.Printf("%v: %v\n", name, ip)    }}这是我的代码:func (addr IPAddr) String() string {    return fmt.Sprintf("%v.%v.%v.%v", addr[0], addr[1], addr[2], addr[3])}它奏效了!但我不明白为什么。我已经收集到我不必显式定义Stringer接口,因为它包含在 中fmt,但是main()我的代码在函数中的哪个位置被使用?它是否会自动在IPAddr它找到的任何类型数据上运行它,这就是为什么在我不做任何事情的情况下修改地图的原因?这是我的第一个基于编译器的语言(我知道一些 Python 和 JavaScript),所以我不知道这个概念是否与其他语言相似。
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

main用于fmt.Printf打印IP地址,String()如果类型实现Stringer接口则使用方法。由于您声明了String() string该类型的方法,因此IPAddr实现了Stringer接口。

您正在寻找的概念称为“Duck Typing”。无需将类型声明为实现接口。如果一个类型具有与接口相同的方法,则该类型实现该接口


查看完整回答
反对 回复 2022-07-25
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信