我昨天开始在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()更改了值?
很抱歉,这个问题令人困惑,但是有人可以向我解释吗?
答案 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
,并以此方式写下来。