golang nil切片与空切片的区别

func main() {
	func main() {
	fmt.Print("\nnil slice\n")
	var slice []int
	fmt.Print(len(slice))
	fmt.Print(cap(slice))
	s := append(slice, 1)
	fmt.Print(s,(slice == nil))

	fmt.Print("\n/\n")
	fmt.Print("\nempty slice\n")
	s1 := make([]int,0,0)
	s1v := append(s1,1,2)
	fmt.Print(s1v)
	fmt.Print(s1v[1])
	//fmt.Print(s1v[len(s1v)])//引发数组越界panic
	var str = "abcd"
	fmt.Print(string(str[1]))
	//fmt.Print(string(str[len(str)])) 引发数组越界panic


	fmt.Print("\n/\n")
	fmt.Print("\nnil map\n")
	var m map[int]int
	fmt.Print(len(m))
	//m1 := map[0] = 0 //报错

	fmt.Print("\n/\n")
	fmt.Print("\nempty map\n")
	m1 := make(map[int]int)
	fmt.Print(len(m1))
	m1[0] = 1
	fmt.Print(m1)
	fmt.Print(len(m1))
	fmt.Print(m1[len(m1)]) //不会引发越界错误,为类型的零值

}

}
//结果
//nil slice
//00[1] trueempty slice

//[1 2]nil map
//0empty map
//0map[0:1]1

	结论:
	nil slice等于nil 未分配内存,empty slice已分配内存,内容指向一块地址
	nil slice、empty slice都可以使用append添加元素
	len()、cap()对nil slice、empty slice都合法,可能正是因为如此,append才合法
	
	未分配的map与初始化零值的map,len()都合法,未分配的map对元素复制出错。
上一篇:7


下一篇:JFinal AOP使用