dongxian1921 2015-04-13 20:55
浏览 15
已采纳

不使用Sprintf的Stringer实现

I am working through the golang tour and I am stuck in one of the exercises. I am not sure why the following does not work for a String() function:

type IPAddr [4]byte

func (addr IPAddr) String() string {
    return string(addr[0]) + "." + string(addr[1]) + "." + string(addr[2]) + "." + string(addr[3])
}

func main() {
    addrs := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for n, a := range addrs {
        fmt.Printf("%v: %v
", n, a)
    }
}

Output:

loopback: ...
googleDNS: ...

Granted that using fmt.Sprintf() would be a nicer solution, but I'm not sure I understand why that function doesn't work.

  • 写回答

2条回答 默认 最新

  • duannuo7878 2015-04-13 21:13
    关注

    What's happening there is that you're passing the byte e.g. 127 directly into string and expecting it to represent that byte as the integer 127 before converting it into a string. Instead what it's doing is interpreting it as a character with the byte value 127.

    Instead you should convert that byte value into an integer, then use the strconv library to format it as a string.

    package main
    
    import (
        "fmt"
        "strconv"
    )
    
    type IPAddr [4]byte
    
    func (addr IPAddr) String() string {
        return strconv.Itoa(int(addr[0])) + "." + strconv.Itoa(int(addr[1])) + "." + strconv.Itoa(int(addr[2])) + "." + strconv.Itoa(int(addr[3]))
    }
    
    func main() {
        addrs := map[string]IPAddr{
            "loopback":  {127, 0, 0, 1},
            "googleDNS": {8, 8, 8, 8},
        }
        for n, a := range addrs {
            fmt.Printf("%v: %v
    ", n, a)
        }
    }
    

    Output:

    loopback: 127.0.0.1
    googleDNS: 8.8.8.8
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line