go语言学习练习题
练习:Stringer
通过让 IPAddr 类型实现 fmt.Stringer 来打印点号分隔的地址。
例如,IPAddr{1, 2, 3, 4} 应当打印为 “1.2.3.4”。
代码
package main
import "fmt"
import "strconv"
type IPAddr [4]byte
// TODO: 给 IPAddr 添加一个 "String() string" 方法
func (f IPAddr) String() string {
str := ""
for _ ,v:= range f{
if str !="" {
str += ","
}
fmt.Printf(strconv.Itoa(int(v)))
str += strconv.Itoa(int(v))
}
return str
}
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)
}
}
运行结果
127001loopback: 127,0,0,1
8888googleDNS: 8,8,8,8
知识点总结
1. 方法声明
func (f IPAddr) String() string {
Go 没有类。不过你可以为结构体类型定义方法。
方法就是一类带特殊的 接收者 参数的函数。
方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。
本例中 声明了带 IPAddr 接收者 参数的函数
2. for 循环的 range 形式 ( foreach )
for _ ,v:= range f{
for 循环的 range 形式可遍历切片或映射。
当使用 for 循环遍历切片时,每次迭代都会返回两个值。第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。
可以将下标或值赋予 _ 来忽略它。
for i, _ := range pow
for _, value := range pow
若你只需要索引,忽略第二个变量即可。
for i := range pow
3. 数字 转 字符
strconv.Itoa(int(v))
在许多语言中,你可以轻松地将任何数据类型转换为字符串,只需将其与字符串连接,或者使用类型转换表达式即可。但是,如果你在Go中尝试执行似乎很明显的操作(例如将int转换为字符串),你不太可能获得预期的效果。
比如下面:
string(120)
复制代码
你期望返回的结果是什么?如果你有使用其他编程语言的经验,那么大多数人的猜测是“ 123”。相反,在Go中上面的类型转换会得到“ E”之类的值,那根本不是我们想要的。因为string()会直接把字节或者数字转换为字符的UTF-8表现形式。
所以在Go中将byte或者int类型的值转换为数字的字符串表现形式的正确方法是使用strconv包中的方法,比如strconv.Itoa。