英文:
trouble with go stringers exercise
问题
在你的代码中,你定义了一个名为IPAddr
的类型,并为它添加了一个String() string
方法。在第一个代码示例中,你使用了fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3])
来格式化输出。而在第二个代码示例中,你使用了fmt.Sprintf("%v.%v.%v.%v", a[0], a[1], a[2], a[3])
来格式化输出。
这两个格式化字符串的区别在于,%d
用于格式化整数,而%v
用于格式化值的默认格式。在这种情况下,a[0]
、a[1]
、a[2]
和a[3]
都是byte
类型的整数,因此它们可以被格式化为整数或默认格式。
当你使用%d
时,它会将byte
类型的整数格式化为十进制数字。而当你使用%v
时,它会根据值的默认格式进行格式化。
在第一个代码示例中,使用%d
格式化输出时,输出的顺序是googleDNS: 8.8.8.8
和loopback: 127.0.0.1
。而在第二个代码示例中,使用%v
格式化输出时,输出的顺序是loopback: 127.0.0.1
和googleDNS: 8.8.8.8
。
这是因为在map
中,元素的顺序是不确定的。当你迭代map
并打印输出时,元素的顺序可能会发生变化。所以,即使你的代码逻辑没有改变,输出的顺序也可能会不同。
如果你希望输出的顺序保持一致,你可以使用slice
来存储map
的键,并对键进行排序后再进行迭代和打印输出。这样可以确保输出的顺序是一致的。
英文:
For the Stringers exercise in tour of Go:
I got two different outputs for two different format printings. And the only thing I changed was the format verbs. They were %v and %d. Theoretically, they would give the same output. However the output's order was changed too, which was so weird. Any ideas about that? Below is my code:
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)
}
}
OutPut:
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)
}
}
Output:
loopback: 127.0.0.1
googleDNS: 8.8.8.8
The output's order was also changed.
答案1
得分: 3
地图是无序的。
> 当使用范围循环迭代地图时,迭代顺序是未指定的,并且不能保证从一次迭代到下一次迭代顺序相同[1]。
[1]https://blog.golang.org/go-maps-in-action#TOC_7.
除了顺序之外,我没有看到%v
和%d
输出之间的任何区别。
英文:
Maps are not ordered.
> When iterating over a map with a range loop, the iteration order is not specified and is not guaranteed to be the same from one iteration to the next[1]
[1]https://blog.golang.org/go-maps-in-action#TOC_7.
I don't see any difference with %v
and %d
output other than order.
答案2
得分: 2
包 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 _, 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)
}
}
答案3
得分: 0
包 main
导入 "fmt"
类型 IPAddr [4]byte
// TODO: 添加一个 "String() string" 方法到 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"
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)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论