Go中值为Nil的slice循环遍历会发生什么

简介: Go中值为Nil的slice循环遍历会发生什么

1. 前言



我们在了解了slice的源码之后得知,它的底层有三个属性,第一个是指向底层数组的指针,第二个是slice的长度,第三个是slice的容量。那当我们定义一个slice的变量的时候,如果给它初始化值是Nil,会发生什么?


2. 实战



先来看看一个例子:


package main
import (
 "fmt"
)
func main() {
 a := []string{"A", "B", "C", "D", "E"}
 a = nil
 fmt.Println(a, len(a), cap(a))
}


结果:

[] 0 0


说明a是一个Nil的slice,它的长度和容量都是0。

但是当我们用for range去遍历值为Nil的slice的时候会出现什么问题呢?

再来看一个例子:


package main
import (
 "fmt"
)
func main() {
 a := []string{"A", "B", "C", "D", "E"}
 a = nil
 fmt.Println(a, len(a), cap(a))
 for i, j := range a {
  fmt.Println(i, j)
 }
}


结果:


[] 0 0


我们看到结果没有变,也没有报错,for range到底做了什么才能在遍历值为Nil的slice的时候不报错呢?


答案就在for range遍历slice的源码中,且看:


编译器对for range的处理流程如下:
  for_temp := range
  len_temp := len(for_temp)
  for index_temp := 0; index_temp < len_temp; index_temp++ {
          value_temp = for_temp[index_temp]
          index = index_temp
          value = value_temp
          origin body
   }

从源码中可以看出,它先得到slice的长度,值为Nil的长度当然是0,所以在for循环遍历的时候,因为长度不满足遍历条件,所以进不去循环,这就证明了值为Nil的切片在for range遍历的时候是没有问题的。


3. 小结



针对slice的特例我们一定要牢记,因为在项目中会大量使用,而且slice的变量是引用传递,所以在使用之前最好有Nil的断言,否则在传递的过程中无法保证被谁赋值为Nil从而导致程序奔溃。

相关文章
|
12月前
|
Go
go语言中遍历映射(map)
go语言中遍历映射(map)
281 8
|
6月前
|
存储 安全 Go
Map的遍历与判断键是否存在-《Go语言实战指南》
本文介绍了 Go 语言中对 `map` 的常见操作,包括遍历所有项和判断键是否存在。通过 `for range` 可以遍历 `map` 的键值对、仅键或仅值(需忽略键)。注意,`map` 遍历顺序是随机的。判断键是否存在时,使用双赋值语法 `value, ok := map[key]`,其中 `ok` 表示键是否存在。直接访问不存在的键会返回类型的零值,可能导致逻辑错误。掌握这些机制可更安全高效地处理键值对数据。
|
12月前
|
存储 Go 索引
go语言中遍历字符串
go语言中遍历字符串
202 5
|
6月前
|
人工智能 Go
[go]Slice 切片原理
本文详细介绍了Go语言中的切片(slice)数据结构,包括其定义、创建方式、扩容机制及常见操作。切片是一种动态数组,依托底层数组实现,具有灵活的扩容和传递特性。文章解析了切片的内部结构(包含指向底层数组的指针、长度和容量),并探讨了通过`make`创建切片、基于数组生成切片以及切片扩容的规则。此外,还分析了`append`函数的工作原理及其可能引发的扩容问题,以及切片拷贝时需要注意的细节。最后,通过典型面试题深入讲解了切片在函数间传递时的行为特点,帮助读者更好地理解和使用Go语言中的切片。
155 0
|
7月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
338 10
|
11月前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
401 12
|
11月前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
142 9
|
11月前
|
Go
go语言for 遍历字符串
go语言for 遍历字符串
160 8
|
12月前
|
Go
go语言中控制循环
go语言中控制循环
132 14
|
12月前
|
Go 索引
go语音中range 循环
go语音中range 循环
172 12