我正在尝试在环游世界(https://tour.golang.org/methods/18)中完成此练习,以实现由四个数组组成的
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之后尝试做
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]) } |
而不是
我独立地提出了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 |