golang 中奇怪的空切片

本文中介绍一个奇怪现象,一个空列表(或切片),却可以打印出列表中的内容。

以下代码中,在一个json字符串中,定义一个列表,列表中有一个空字符串。

接着,将json字符串解析到结构体中,最后,打印结构体中的字符串列表。

package main


import (
    "fmt"
    "encoding/json"
)

type Host struct {
    IPList []string
}

func main() {

    b := []byte(`{"IPList": [""]}`)

    h := Host{}

    err := json.Unmarshal(b, &h)
    if err != nil {
        fmt.Println("Umarshal failed:", err)
        return
    }


    fmt.Println("host:", h)
    fmt.Println("IPList:", h.IPList, ", len:", len(h.IPList))
    for _,ip := range h.IPList {
        fmt.Println("ip:", ip, ", len:", len(ip))
    }
}

output:

host: {[]}
IPList: [] , len: 1
ip: , len: 0

从输出可以看到,IPList是空列表,在遍历时,却可以打印出内容–空字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang的数组和切片是两种不同的数据类型,用于存储相同数据类型的容器。数组的长度是固定的,而切片的长度是可变的。在日常应用切片的使用更为普遍。 数组在声明需要指定长度,并且在初始化必须提供相同长度的元素。例如,`a := int{1, 2, 3}`就是一个长度为3的整数数组。数组的长度一旦确定后就不能更改。 切片是基于数组的引用类型。它不需要指定固定的长度,并且可以根据需要动态扩展或缩小。切片包装着底层数组,通过指定起始索引和结束索引来指定子集。例如,`b := a[:]`就是一个切片,它包含了数组a的所有元素。 数组适用于需要固定长度的场景,而切片适用于长度可变的情况。在实际应用切片更常用,因为它提供了更大的灵活性和便利性。 总结: - 数组是长度固定的容器,切片是长度可变的容器; - 数组在声明需要指定长度,切片则不需要; - 数组的长度一旦确定后就不能更改,而切片可以根据需要动态扩展或缩小; - 切片是基于数组的引用类型,可以通过指定起始索引和结束索引来指定子集。 参考资料: Golang的「数组」和「切片」都是存储同一数据类型的容器,只不过Golang的数组长度是固定的,而切片的长度是可变化的。 切片是引用类型,切片包装的数组称为该切片的底层数组。我们来看一段代码://a是一个数组,注意数组是一个固定长度的,初始化候必须要指定长度,不指定长度的话就是切片了 a := int{1, 2, 3} //b是数组,是a...。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值