围棋巡回赛中的 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)
}
}
输出:
谷歌DNS:8.8.8.8
环回: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)
}
}
输出:
环回:127.0.0.1
谷歌DNS:8.8.8.8
输出的顺序也发生了变化。
地图未订购。
使用范围循环迭代映射时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代顺序相同[1]
[1]https://blog.golang.org/go-maps-in-action#TOC_7。
除了顺序之外,我没有看到
%v
和 %d
输出有任何区别。
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)
}
}
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)
}
}
package main
import ( "fmt"
"strconv"
)
type IPAddr [4]byte
// TODO: Add a "String() string" method to IPAddr.
func (ip IPAddr) String() string{
stri:=strconv.Itoa(int(ip[0]))
for i:=1;i<4;i++ {
stri+= "."+strconv.Itoa(int(ip[i]))
}
return stri
}
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)
}
}