Go 3 数组、切片、函数

数组

数组是值类型:必须规定数组长度   [ ]int是切片  [5]int是一个数组

注意:数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。因此,数组不能被调整大小。切片解决此问题

a := [3]int{5, 78, 8}
var b [5]int b = a //not possible since [3]int and [5]int are distinct types
数组被分配给一个新变量时,将把原始数组的副本分配给新变量。
如果对新变量进行了更改,则不会在原始数组中反映。

值传递与参数传递(引用)
值传递:拷贝
引用传递:不是

 

Go语言中一般不直接使用数组

声明

var array1 [5]int
array2 := [3]int{1,2,3}
array3 := [...]int{1,2,3}
var grid [4][5] bool

长度

通过将数组作为参数传递给len函数,可以获得数组的长度。

遍历数组:传统

a := [...]float64{67.7, 89.8, 21, 78}
    for i := 0; i < len(a); i++ { //looping from 0 to the length of the array
        fmt.Printf("%d th element of a is %.2f\n", i, a[i])
    }

遍历数组:range

for _,v := range arr3 {
      fmt.Println(v)  
}
for i,v := range arr3 {
      fmt.Println(i,v)  
}
for i := range arr3 {
      fmt.Println(arr3[i])  
}
注:任何地方都可通过_省略变量

多维数组

var threedim [5][10][4]int

切片

切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由。

概念:

从概念上面来说slice像一个结构体,这个结构体包含了三个元素:
指针,指向数组中slice指定的开始位置
长度,即slice的长度
最大长度,也就是slice开始位置到数组的最后位置的长度

slice本身没有数据,是对底层array的一个view对slice所做的任何修改都将反映在底层数组中。

一个切片在未初始化之前默认为 nil,长度为 0

 语法

定义:
arr := [...]int{0,1,2,3,4,5,6}
s := arr[2,6]
updateSlice:s1 :=arr[2:]   s2 := arr[:]
Reslice: s := arr[2:6]  s = s[:3]  s = s[1:]   s = arr[:]
添加元素:s = append(s,val)  如果超越cap,系统会重新分配更大的底层数组
由于值传递关系,必须接收append返回值     如果len大了,cap开始是32,后64,再128

append()

append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice

append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩 余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。

返回的slice数组指针将指向这个空间,而原 数组的内容将保持不变;其它引用此数组的slice则不受影响

copy()

 copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数

猜你喜欢

转载自www.cnblogs.com/ycx95/p/9368856.html