dtjpz48440 2017-10-08 01:02
浏览 33
已采纳

去接收器隐式指针转换不起作用

I'm learning Go, and I was following the go tour.

In the exercise about Stringer, here, Implementing the function with a *IPAddr receiver doesn't seem to work, which the go tour describes as should work.

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (ip *IPAddr) String() string {
    return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
}
func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v
", name, ip)
    }
}

Output is:

loopback: [127 0 0 1]
googleDNS: [8 8 8 8]

But changing String() string to func (ip IPAddr) from func (ip *IPAddr) gives the correct output:

loopback: 127.0.0.1
googleDNS: 8.8.8.8

Why is that?

  • 写回答

2条回答 默认 最新

  • dongzi3434 2017-10-08 01:17
    关注

    The implicit conversion means that you can call the function on either a value, or pointer, but it does not satisfy the implementation of an interface. If you implement an interface with a pointer receiver, the pointer must be used in the function call.

    The code below shows the *IPAddr used with the Stringer interface, and an IPAddr used with the new foo() function (also implemented with a pointer receiver):

    package main
    
    import "fmt"
    
    type IPAddr [4]byte
    
    // TODO: Add a "String() string" method to IPAddr.
    func (ip *IPAddr) String() string {
        return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
    }
    
    func (ip *IPAddr) foo() string {
        return "bar"
    }
    
    func main() {
        hosts := map[string]IPAddr{
            "loopback":  {127, 0, 0, 1},
            "googleDNS": {8, 8, 8, 8},
        }
        for name, ip := range hosts {
            fmt.Printf("%v: %v
    ", name, &ip)
    
        fmt.Println(ip.foo())
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看