新手,所以请多多包涵。我一直在看“Tour of Go”页面,偶然发现了一些关于 Stringers 的令人费解的东西。考虑https://tour.golang.org/methods/18上的练习我最初的回答是实施func (this *IPAddr) String() string { return fmt.Sprintf("%d.%d.%d.%d", this[0], this[1], this[2], this[3])}但是,这不用于 f 主要打印只是fmt.Printf("%v: %v\n", name, ip). 如果我将打印更改为fmt.Printf("%v: %v\n", name, ip.String()),则无论接收器类型是*IPAddr还是IPAddr) 都将使用它。为什么会这样?
2 回答
白衣染霜花
TA贡献1796条经验 获得超10个赞
因为您将IPAddr值传递给fmt.Printf,所以您的String()方法不是方法集的一部分。如果您传入一个指针,您的解决方案就可以工作:
fmt.Printf("%v: %v\n", name, &ip)
但一般的解决方案是不使用指针接收器:
func (ip IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
这样,该String()方法可以从IPAddr您传递给Printf的 或 中使用*IPAddr,其中包括值接收器的方法。
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
首先,永远不要调用方法接收器this。这违反了Style。
其次,您已经定义了方法 on *IPAddr,而不是IPAddr. 做这个:
func (ip IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消