Go 之旅:了解纵梁练习

imp*_*man 0 interface go

我正在对纵梁进行这个练习。

问题:使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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

func (addr IPAddr) String() string {
    return fmt.Sprintf("%v.%v.%v.%v", addr[0], addr[1], addr[2], addr[3])
}
Run Code Online (Sandbox Code Playgroud)

它成功了!但我不明白为什么。我发现我不必显式定义Stringer接口,因为它包含在 中fmt,但是main()我的代码在函数中的哪个位置被使用?它是否会自动在它找到的任何类型数据上运行它IPAddr,这就是为什么在我不做任何事情的情况下修改地图的原因?这是我的第一个基于编译器的语言(我了解一些Python和JavaScript),所以我不知道这个概念是否与其他语言类似。

Bur*_*dar 5

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

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