最近在刷力扣发现一个好玩的东西,可能因为我以前习惯用make声明slice和map ,然后今天用var关键字声明发现出问题了。
闲来没事谢谢杂谈哈哈哈哈哈哈
例子如下:
func singleNumber(nums []int) int {
var num int
var exam map[int]bool
for _, v := range nums {
if _, ok := exam[v]; !ok {
exam[v] = true
} else {
exam[v] = false
}
}
for _, v := range nums {
if exam[v] {
num = v
}
}
return num
}
func singleNumber(nums []int) int {
var num int
exam:=make(map[int]bool)
for _, v := range nums {
if _, ok := exam[v]; !ok {
exam[v] = true
} else {
exam[v] = false
}
}
for _, v := range nums {
if exam[v] {
num = v
}
}
return num
}
我个人理解的原因如下:
make来声明的时候已经分配内存空间并初始化,而用var声明变量的时候没有初始化还是nil。
然后还看到个好玩的东西,然后我从别人那里借鉴过来了。
零切片、空切片、nil切片的区别?
答案我放下面你们想想
Go语言中的零切片、空切片、nil切片这三者是不同的东西,切片的创建方式有很多种,不同方式创建出来的切片也不一样。
- 零切片
我们把切片内部数组的元素都是零值或者底层数组的内容全是 nil的切片叫做零切片,使用make创建的、长度、容量都不为0的切片就是零值切片
slice1 := make([]int,5) // 0 0 0 0 0
slice2 := make([]*int,5) // nil nil nil nil nil
- nil切片
nil切片(nil slice)的长度和容量都为0,并且和nil比较的结果为true,采用直接创建切片的方式、new创建切片的方式都可以创建nil切片
var slice3 []int
var slice4 = *new([]int)
- 空切片(empty slice)的长度和容量也都为0,但是和nil的比较结果为false,因为所有的空切片的数据指针都指向同一个地址 0xc42003bda0;使用字面量、make可以创建空切片:
var slice5 = []int{}
var slice6 = make([]int, 0)