Go的新手,请耐心等待。
我一直在关注" Go 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])
}
然而,这不仅仅用于fmt.Printf("%v: %v\n", name, ip)
的主打印。如果我将打印更改为fmt.Printf("%v: %v\n", name, ip.String())
,则无论接收方类型是*IPAddr
还是IPAddr
,都会使用它。
为什么会这样?
答案 0 :(得分:3)
由于您将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
,其中包含价值接收者。
答案 1 :(得分:1)
首先,永远不要调用方法接收器this
。这是针对Style。
其次,您已在*IPAddr
上定义了方法,而不是IPAddr
。这样做:
func (ip IPAddr) String() string {
return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}