参加Go之旅中的Stringers练习: 我有两种不同的输出用于两种不同的格式打印。而我唯一改变的是格式动词。它们是%v和%d。从理论上讲,他们会给出相同的输出。但是输出的顺序也改变了,这太奇怪了。关于那个的任何想法?以下是我的代码:
package main
import "fmt"
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (a IPAddr)String() string{
// Here is what I changed
return fmt.Sprintf("%d.%d.%d.%d",a[0],a[1],a[2],a[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)
}
}
输出:
googleDNS:8.8.8.8
loopback:127.0.0.1
package main
import "fmt"
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (a IPAddr)String() string{
// Here is what I changed
return fmt.Sprintf("%v.%v.%v.%v",a[0],a[1],a[2],a[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
输出的顺序也发生了变化。
答案 0 :(得分:2)
不订购地图。
在使用范围循环迭代地图时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代[1]
[1]https://blog.golang.org/go-maps-in-action#TOC_7.
除了订单之外,我发现%v
和%d
输出没有任何差异。
答案 1 :(得分:1)
package main
import "fmt"
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (ip IPAddr) String() string {
var s string
for i:= range ip{
if(i==0){
s +=fmt.Sprint(int(ip[i]))
} else{
s +="."+fmt.Sprint(int(ip[i]))
}
}
return s
}
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\n", name, ip)
}
}
答案 2 :(得分:1)
package main
import (
"fmt"
)
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (ip IPAddr) String() string {
var s string
for _, v := range ip {
s += fmt.Sprint(int(v)) + "."
}
sr := s[:len(s)-1]
return sr
}
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\n", name, ip)
}
}