Stringers的令人费解的行为?

时间:2016-09-01 19:22:52

标签: go

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,都会使用它。

为什么会这样?

2 个答案:

答案 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])
}