golang 中奇怪的空切片

本文探讨了一个编程奇观:在Go语言中,一个空的字符串列表在遍历时居然能打印出空字符串。通过一段代码示例展示了如何从JSON解析到结构体,并在遍历过程中遇到的这一现象。尽管列表长度为0,但仍然能够输出内容,揭示了编程中的一个微妙细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

以下代码中,在一个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是空列表,在遍历时,却可以打印出内容–空字符串。

### Golang切片的用法和特性 #### 切片的基础概念 在Go语言中,切片(slice)是在数组基础上构建的一种抽象数据类型。切片提供了更灵活的数据结构操作方式,允许动态调整长度并支持高效的内存管理[^1]。 #### 创建与初始化切片 可以通过多种方法创建切片: - 使用 `make` 函数来分配一个新的底层数组,并返回指向该数组起始位置的一个指针作为切片: ```go s := make([]int, length, capacity) ``` - 或者通过字面量定义一个固定大小的数组再将其转换成切片: ```go a := [...]string{"apple", "banana", "cherry"} fruits := a[:] // 将整个数组a转化为切片fruits ``` 也可以直接声明一个未指定长度的字符串切片用于存储文件中的数字字符序列[^2]: ```go digits := []byte{} ``` #### 访问元素及遍历 访问单个元素的方式与其他编程语言相似,即采用索引形式 `s[index]` 来获取特定位置上的值;而要迭代处理所有成员,则可以利用for循环配合内置函数len()实现: ```go for i := 0; i < len(s); i++ { fmt.Printf("%d ", s[i]) } // 或者使用range简化语法糖 for idx, val := range s { fmt.Printf("index=%d value=%v\n", idx, val) } ``` #### 修改切片内容 由于切片内部维护着对底层连续内存区域的引用关系,在修改某个具体项时实际上就是改变相应地址处的内容。因此任何针对原生类型的赋值都会影响到实际存在的那份共享资源。 需要注意的是当超出当前容量(capacity)范围追加新项目(`append`)会触发重新分配更大的空间给新的底层数组副本从而不影响旧版本的状态[^3]. #### 高效性能表现 得益于其独特的设计思路——既保留了随机存取的优势又兼顾到了可变尺寸的需求,使得Go下的切片成为了一种非常高效实用的选择方案之一。特别是在面对大量同质化对象的操作场景下更是如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值