gpt4 book ai didi

go - 不使用 Sprintf 的 Stringer 实现

转载 作者:IT王子 更新时间:2023-10-29 01:51:22 26 4
gpt4 key购买 nike

我正在完成 golang 之旅,但我被困在其中一个练习中。我不确定为什么以下内容不适用于 String() 函数:

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", n, a)
}
}

输出:

loopback: ...
googleDNS: ...

诚然,使用 fmt.Sprintf() 会是一个更好的解决方案,但我不确定我是否理解为什么该函数不起作用。

最佳答案

那里发生的事情是你正在传递字节,例如127 直接转换为字符串,并期望它在将其转换为字符串之前将该字节表示为整数 127。相反,它所做的是将其解释为字节值为 127 的字符。

相反,您应该将该字节值转换为整数,然后使用 strconv 库将其格式化为字符串。

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", n, a)
}
}

输出:

loopback: 127.0.0.1
googleDNS: 8.8.8.8

关于go - 不使用 Sprintf 的 Stringer 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com