为了账号安全,请及时绑定邮箱和手机立即绑定

Stringers 的令人费解的行为?

Stringers 的令人费解的行为?

Go
慕仙森 2022-03-07 19:36:24
新手,所以请多多包涵。我一直在看“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,其中包括值接收器的方法。


查看完整回答
反对 回复 2022-03-07
?
素胚勾勒不出你

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])

}


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信