Golang 数组与切片的对比【防备忘】


Go的数组可以说是不经常用到,切片会用到的更多,但是Go的数组与C的数组又有着不同,所以还是想写一下。

一、数组

1.定义

  • Go语言的数组是值类型,什么意思呢?
  • C语言的数组,大家都知道,数组的名字就代表,这个数组 的第一个元素的指针,然后通过这个指针的加加减减,可以获取到数组中的任何一个值。
  • 而Go不是这样的,Go的数组是值类型,它的数组名字并不能代表这个指针,这里说的或许不是很恰当,我们无法通过Go的数组名字的加加减减,来获取数组中的值。
①最基本的定义
var arr1 [5]int    //[ ]中必须要有数据,没有的话是切片
②定义的时候初始化
arr2 := [...]int{1,2,3,4,5}  //这种形式表示的话,数组中的必须给全,你写4个数,它就认为数组长度是4
arr2 := [5]int{1,2,3,4,5}  //这数组中的数可以省略,从前往后依次排,没排到的就是0
arr2 := []int{1,2,3,4,5} //这个玩意是切片,淦
arr2 = arr1  //把arr1数组中的值全都传给了arr2
③定义数组指针
var arr3 := new([5]int)
var arr4 [5]int
arr4 = *arr3   //把arr3数组中的值全都传给了arr4
这句怎么理解,Go的数组是值类型,你就把[n]type当成基本类型,intstringfloat32等等一样就行
比如我们定义一个int a=9,b=10;   int *c=&b;   a=*b
这个作个插入曲,大家看看下面,这两个有什么不相同
var temp1 *int
var temp2 = new(int)
①temp1与temp2的类型是一样的,都是指向int类型的指针
②不同的是,temp1是个int型指针,但是它并未指向任何地址;
temp2也是一个int型的指针,但是它new了,表示已经申请了地址了
如果你想直接要带指向空间的指针类型就用new
如果你只想要一个无任何指向的指针,那就用第一个

2.调用数组

函数如何调用数组呢?
func AddTemp(tn [5]int){...}
形参[n]type[ ]中必须要有数组,你传入数组多大,这个就必须多大,一一对应
func AddPoint(th *[5]int){...}
这个是传入数组指针类型的

var arr1 [5]int
var arr2 =new([5]int)
如何传入函数
AddTemp(arr1)  AddTemp(*arr2)
AddPoint(&arr1)  AddPoint(arr2)
这样就很清楚了

二、切片

1.定义

最基本定义
var slice []int  //这个玩意就是切片,切切切片
如何给切片初始化:前提先有一个数组存在
var arr [5]int
arr := [...]int{1,2,3,4,5}
arr := [5]int{1,2,3,4,5}
好,数组有了,如何传递给切片呢?
slice = arr[m:n] 

没有数组存在如何定义、初始化切片呢?
slice := [...]int{1,2,3,4,5}[:]  //这样可以
slcie := []int{1,2,3,4,5}       //这个,这个,即使后边没有[m:n]也是切片

还有一种方式,就是make
var slice = make([]int, 10, 100)   //这里不再解释
这里再插一句
比如定义了两个切片slice1和slice2
然后执行一句 silce1=slice2
这样的话slice1与slice2就是互为别名了,说白了,就是绑定了
无论对哪一个切片进行改动,另一个切片也会改变

2.调用切片

函数如何调用切片呢
var slice []int

func AddTemp(a []int){...}
func AddPoint(a *[]int){...}
调用:
AddTemp(slice)
AddPoint(&slice)

如果将一个数组直接传入切片形参的函数,应该这样
AddTemp(arr[m:n])

三、总结

  1. 数组,类型(type)前面只要见到[n],就是里面有数字的,或者[…] 的就是数组
  2. 切片,只要见到[ ]里面,毛也没有,以及数组后边有[m:n]的,它就是切片
  3. Go 切片传递的隐藏危机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋山刀名鱼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值