与go stringers练习有问题

huangapple go评论81阅读模式
英文:

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.8loopback: 127.0.0.1。而在第二个代码示例中,使用%v格式化输出时,输出的顺序是loopback: 127.0.0.1googleDNS: 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)
  }
}

huangapple
  • 本文由 发表于 2015年2月6日 04:01:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/28352975.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定