我正在尝试在环游世界(https://tour.golang.org/methods/18)中完成此练习,以实现由四个数组组成的IPAddr类型的String()方法个字节。到目前为止,我已经尝试过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
   "fmt"
   "strings"
)

type IPAddr [4]byte

func (ipaddr IPAddr) String() string {
    ipaddrStrings := make([]string, 4)
    for i, b := range ipaddr {
        ipaddrStrings[i] = string(b)
    }
    return strings.Join(ipaddrStrings,".")
}

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

但是,此打印

1
2
loopback: ...
googleDNS:.

我还在https://programming.guide/go/convert-byte-slice-to-string.html之后尝试做string(ipaddr),但这会导致

1
cannot convert ipaddr (type IPAddr) to type string

如何完成本练习?

  • string(ipaddr[:])似乎只是返回一个空字符串。另外,根据en.wikipedia.org/wiki/IP_address#IPv4_addresses的说法,IPv4地址由32位或4个字节组成,因此我认为这个问题很现实。

添加此方法:

1
2
3
func (a IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3])
}

而不是string(b),请尝试strconv.Itoa(int(b))将数字值转换为字符串。


我独立地提出了bserdar概述的相同解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
   "fmt"
   "strconv"
   "strings"
)

type IPAddr [4]byte

func (ipaddr IPAddr) String() string {
    ipaddrStrings := make([]string, 4)
    for i, b := range ipaddr {
        ipaddrStrings[i] = strconv.Itoa(int(b))
    }
    return strings.Join(ipaddrStrings,".")
}

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

} ??

此打印:

1
2
loopback: 127.0.0.1
googleDNS: 8.8.8.8