//nil空切片和空切片不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)
//空切片的引用数组指针地址是有的,且固定为一个值,即所有的空切片指向的数组引用地址都是一样的
//切片之间是不能相互比较的,我们不能用==操作符来判断两个切片是否含有全部相同元素
//切片唯一合法的比较操作是与nil比较,一个nil值的切片并没有底层数组,长度和容量都是0,没有申请内存
//但注意,我们不能说一个长度和容量都是0的切片就一定是nil
package main
//nil空切片和空切片不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)
//空切片的引用数组指针地址是有的,且固定为一个值,即所有的空切片指向的数组引用地址都是一样的
import "fmt"
//切片之间是不能相互比较的,我们不能用==操作符来判断两个切片是否含有全部相同元素
//切片唯一合法的比较操作是与nil比较,一个nil值的切片并没有底层数组,长度和容量都是0
//但注意,我们不能说一个长度和容量都是0的切片就一定是nil
func main() {
var a []int //没有底层数组,nil切片,没有申请内存
b := []int{} //有底层数组,但长度和宽度均为0,空切片
c := make([]int, 0) //空切片
if a == nil {
fmt.Printf("a为nil\n") //只有这个输出
}
if b == nil {
fmt.Printf("b为nil")
}
if c == nil {
fmt.Printf("c为nil")
}
//要判断一个切片是空,应该用len(s)==0判断,而不应该用s==nil
//切片是引用传递,和数组不一样,切片把管理权也给了,即一起管理同一个数组
d := make([]int, 3) //空切片[0,0,0]
fmt.Println(d)
e := d //e与d共用一个底层数组,e的值变了,d也跟着变
e[0] = 100
fmt.Println(d[0]) //对e修改值,d切片的值也一起变
fmt.Println(e[0])
//遍历切片,像数组那样
for index, e := range e {
fmt.Println(index, e)
}
}