围棋教程:了解梯边梁练习



我在做这个关于桁条的练习。

问题:使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接口。

您正在寻找的概念被称为";鸭子打字";。没有必要将类型声明为实现接口。如果一个类型具有与接口相同的方法,则该类型实现该接口

最新更新