我在做这个关于桁条的练习。
问题:使IPAddr
类型实现fmt.Stringer
,以将地址打印为虚线四边形。例如,IPAddr{1, 2, 3, 4}
应打印为"1.2.3.4"
。
起始代码:
package main
import "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: %vn", 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(,所以我不知道这个概念是否与其他语言相似。
main
使用fmt.Printf
打印IP地址,如果类型实现Stringer
接口,则使用String()
方法。由于您为该类型声明了String() string
方法,因此IPAddr
实现了Stringer
接口。
您正在寻找的概念被称为";鸭子打字";。没有必要将类型声明为实现接口。如果一个类型具有与接口相同的方法,则该类型实现该接口