You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段Golang代码实现IP地址格式化为何结果存在差异?

为什么两段Golang代码执行结果不同?

两段代码的核心差异在于IPAddr类型的String()方法中,字符串切片的构建逻辑完全不同,直接导致了最终拼接结果的区别:

应用1的正确逻辑

应用1的String()方法中:

  1. s := make([]string, len(ip)) 创建了一个长度为4、容量为4的字符串切片,切片初始包含4个字符串零值(空字符串"")。
  2. 通过for i := range ip遍历IP数组的索引,直接对切片的对应索引位置赋值:s[i] = strconv.Itoa(int(ip[i])),这会覆盖切片中原有的空字符串。
  3. 最终切片内容为["127", "0", "0", "1"],通过strings.Join用.拼接后,得到正常的点分十进制IP格式。

应用2的错误逻辑

应用2的String()方法中:

  1. 同样用make([]string, len(ip))创建了长度为4的切片,初始包含4个空字符串。
  2. 但循环用for _, val := range ip遍历IP数组的值,然后调用append(s, strconv.Itoa(int(val)))——append的作用是把新元素追加到切片的末尾,而不是覆盖原有元素。
  3. 最终切片内容变成了["", "", "", "", "127", "0", "0", "1"],strings.Join会把所有元素用.连接,前面4个空字符串就会生成4个连续的.,所以结果会是....127.0.0.1。

修正应用2的两种方式

如果想用append实现正确逻辑,有两种修改方法:

  1. 初始化切片时只指定容量,不指定长度:
s := make([]string, 0, len(ip)) // 长度0,容量4
for _, val := range ip {
    s = append(s, strconv.Itoa(int(val)))
}
  1. 保持原切片初始化方式,改用索引赋值(和应用1一致):
s := make([]string, len(ip))
for i, val := range ip {
    s[i] = strconv.Itoa(int(val))
}

内容的提问来源于stack exchange,提问作者Sunday Ezeilo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:32:40