Stringers 的令人费解的行为?

新手,所以请多多包涵。


我一直在看“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) 都将使用它。


为什么会这样?


慕仙森
浏览 140回答 2
2回答

白衣染霜花

因为您将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,其中包括值接收器的方法。

素胚勾勒不出你

首先,永远不要调用方法接收器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])}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go