两段Golang代码实现IP地址格式化为何结果存在差异?
为什么两段Golang代码执行结果不同?
两段代码的核心差异在于IPAddr类型的String()方法中,字符串切片的构建逻辑完全不同,直接导致了最终拼接结果的区别:
应用1的正确逻辑
应用1的String()方法中:
s := make([]string, len(ip))创建了一个长度为4、容量为4的字符串切片,切片初始包含4个字符串零值(空字符串"")。- 通过
for i := range ip遍历IP数组的索引,直接对切片的对应索引位置赋值:s[i] = strconv.Itoa(int(ip[i])),这会覆盖切片中原有的空字符串。 - 最终切片内容为
["127", "0", "0", "1"],通过strings.Join用.拼接后,得到正常的点分十进制IP格式。
应用2的错误逻辑
应用2的String()方法中:
- 同样用
make([]string, len(ip))创建了长度为4的切片,初始包含4个空字符串。 - 但循环用
for _, val := range ip遍历IP数组的值,然后调用append(s, strconv.Itoa(int(val)))——append的作用是把新元素追加到切片的末尾,而不是覆盖原有元素。 - 最终切片内容变成了
["", "", "", "", "127", "0", "0", "1"],strings.Join会把所有元素用.连接,前面4个空字符串就会生成4个连续的.,所以结果会是....127.0.0.1。
修正应用2的两种方式
如果想用append实现正确逻辑,有两种修改方法:
- 初始化切片时只指定容量,不指定长度:
s := make([]string, 0, len(ip)) // 长度0,容量4 for _, val := range ip { s = append(s, strconv.Itoa(int(val))) }
- 保持原切片初始化方式,改用索引赋值(和应用1一致):
s := make([]string, len(ip)) for i, val := range ip { s[i] = strconv.Itoa(int(val)) }
内容的提问来源于stack exchange,提问作者Sunday Ezeilo
相关产品推荐
相关产品推荐

