猿问

围棋之旅:了解纵梁练习

我在纵梁上做这个练习。


问题:使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: %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),所以我不知道这个概念是否与其他语言相似。


芜湖不芜
浏览 102回答 1
1回答

天涯尽头无女友

main用于fmt.Printf打印IP地址,String()如果类型实现Stringer接口则使用方法。由于您声明了String() string该类型的方法,因此IPAddr实现了Stringer接口。您正在寻找的概念称为“Duck Typing”。无需将类型声明为实现接口。如果一个类型具有与接口相同的方法,则该类型实现该接口
随时随地看视频慕课网APP

相关分类

Go
我要回答