我在纵梁上做这个练习。问题:使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”。无需将类型声明为实现接口。如果一个类型具有与接口相同的方法,则该类型实现该接口
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消