函数自动执行而不被调用

时间:2018-12-19 00:20:02

标签: go

我昨天开始在Tour of Go网站上学习Go,我认为我对所有事情都了解得很好;

但是后来我对斯金格斯的练习完全感到困惑:https://tour.golang.org/methods/18

所以我搜索了一个解决方案以查看我做错了什么,我发现了这一点:

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.

func (i IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", i[0], i[1], i[2], i[3])   

 }

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)
    }
}

输出是这样的

loopback: 127.0.0.1
googleDNS: 8.8.8.8

这让我完全困惑;

为什么该功能会自动激活?它不应该像:函数内部的i.String()吗?

为什么fmt.Printf在屏幕上什么也不显示?

还是fmt.Printf返回该错误,因为String()更改了值?

很抱歉,这个问题令人困惑,但是有人可以向我解释吗?

1 个答案:

答案 0 :(得分:6)

如果您查看the previous page in the tutorial,则会发现Stringer包中定义了an interface fmt。实施String()方法automatically使IPAddr实施此接口。

fmt.Printf函数检查其参数是否实现了Stringer接口。从现在开始,它在需要弄清楚如何显示String时会调用IPAddress方法(您可以使用%v以外的格式说明符来更改此行为,但这是超出了问题的范围。

fmt.Printf呼叫显示了一些内容;它显示了线条

loopback: 127.0.0.1
googleDNS: 8.8.8.8

它没有改变它们的价值或任何东西;它只是调用了String方法来弄清楚如何写下IPAddr,并以此方式写下来。