Golang之数组、切片,有何区别

初始化

  • 数组
    var arr1 [4]int                        //数组会初始化为int类型的零值
	var arr2 = [4]int{1, 2}                 //使用指定的初始值完成初始化
	var arr3= [4]string{"北京", "上海", "天津"} //使用指定的初始值完成初始化
    arr4 := [3]int{1,2,3}      //指定固定长度,不可修改
    arr5 := [...]int{1,2,3}    //根据初始值的个数自行推断数组的长度
    arr6 := [...]int{1: 1, 3: 5}   // [0 1 0 5]   使用指定索引值的方式来初始化数组

*注意

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值,数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的

切片(slice):

切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。

切片是一个引用类型,内部结构包含地址长度(len)容量(cap)

定义:var name []T   //name变量名;T代表元素类型

    var a []string              //声明一个字符串切片
	var b = []int{}             //声明一个整型切片并初始化
	var c = []bool{false, true} //声明一个布尔切片并初始化

切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的lowhigh表示一个索引范围(左包含,右不包含)

完整切片表达式:

a[min:hign:max]   //容量=max-min

完整切片表达式需要满足的条件:0 <= low <= high <= max <= cap(a)

    a := [6]int{1, 2, 3, 4, 5, 6}
	t := a[2:4:6]
	t2 := a[3:5]
    t3 := a[:5]
	fmt.Println(t, len(t), cap(t))     //[3 4] 2 4
	fmt.Println(t2, len(t2), cap(t2))  //[4 5] 2 3   容量等于得到的切片的底层数组的容量
    fmt.Println(t3, len(t3), cap(t3))  //[1 2 3 4 5] 5 6    容量=cap(a)-min
    

*注意

切片是引用类型,不支持==,只能跟nil比较

总结:

  • 数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性
  • 切片是动态数组
  • 数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值