让 IPAddr
类型实现 fmt.Stringer
以便用点分格式输出地址。
例如,`IPAddr{1,`2,`3,`4}` 应当输出 `"1.2.3.4"`。
package main import ( "fmt" "strconv" //"strings" "bytes" ) type IPAddr [4]byte // 方法1:采用strings 工具包方案实现,需要引入strings //func (ipAddr IPAddr) String() string { // s := make([]string, len(ipAddr)) // for i := range ipAddr { // s[i] = strconv.Itoa(int(ipAddr[i])) // } // return strings.Join(s, ".") //} // 方法2:采用bytes.Buffer 方案实现,需要引入bytes;并且数据比较大的时候效率相当高 func (ipAddr IPAddr) String() string { var buf bytes.Buffer for i:=0; i<len(ipAddr); i++ { if i == 0 { buf.WriteString(strconv.Itoa(int(ipAddr[i]))) } else { buf.WriteString(".") buf.WriteString(strconv.Itoa(int(ipAddr[i]))) } } return buf.String() } 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) } }
这个本来是go中文指南上的一个练习题,但是我在写的时候,经常string(ipAddr[i]) 打印出来是空格看不见(ascii码中都不是可见字符);查了资料才发现是转码了;
在这里直接用了strings 工具包和strconv 工具包(strconv包使用)
https://studygolang.com/articles/6189 (Go语言中连接多个字符串)