Go的数组可以说是不经常用到,切片会用到的更多,但是Go的数组与C的数组又有着不同,所以还是想写一下。
一、数组
1.定义
- Go语言的数组是值类型,什么意思呢?
- C语言的数组,大家都知道,数组的名字就代表,这个数组 的第一个元素的指针,然后通过这个指针的加加减减,可以获取到数组中的任何一个值。
- 而Go不是这样的,Go的数组是值类型,它的数组名字并不能代表这个指针,这里说的或许不是很恰当,我们无法通过Go的数组名字的加加减减,来获取数组中的值。
①最基本的定义
var arr1 [5]int
②定义的时候初始化
arr2 := [...]int{1,2,3,4,5}
arr2 := [5]int{1,2,3,4,5}
arr2 := []int{1,2,3,4,5}
arr2 = arr1
③定义数组指针
var arr3 := new([5]int)
var arr4 [5]int
arr4 = *arr3
这句怎么理解,Go的数组是值类型,你就把[n]type当成基本类型,int、string、float32等等一样就行
比如我们定义一个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}
还有一种方式,就是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])
三、总结
- 数组,类型(type)前面只要见到[n],就是里面有数字的,或者[…] 的就是数组
- 切片,只要见到[ ]里面,毛也没有,以及数组后边有[m:n]的,它就是切片
- Go 切片传递的隐藏危机