golang之数组与切片

数组

数组可以存放多个同一类型数据,数组也是一种数据类型,在Go中,数组是值类型。

数组的定义:

  var 数组名 [数组大小]数据类型

  var a [5]int

  赋初值   a[0] = 1    a[1] = 30 ....

数组在内存布局

 

 总结:

  1)数组的地址可以通过数组名来获取 &intArr

  2)数组的第一个元素的地址,就是数组的首地址

  3)数组的各个元素的地址间隔是依据数组的类型决定,比如int64——>8    int32——>4 ....

数组遍历:

  for-range

    这是Go语言一种独有的结构,可以用来遍历访问数组的元素

    用法:

      for index, value := range array01 {

      ...

      }

注意事项和使用细节:

  1)数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化

  2)var arr []int 这时arr就是一个slice切片

  3)数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用

  4)数组创建后,如果没有赋值,有默认值0

  5)使用数组的步骤 1. 声明数组并开辟空间  2.给数组各个元素赋值  3.使用数组

  6)数组的下标是从0开始的

  7)数组下标必须在指定范围内使用,否则报panic:数组越界

  8)Go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝,数组间不会相互影响 

  9)如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)、

  10)长度是数组类型的一部分,在传递函数参数时需要考虑数组的长度。

四种初始化数组的方式:

var numsArray01 [3]int = [3]int {1, 2, 3}
var numsArray02 = [3]int {1, 2, 3}
var numsArray03 = [...]int {6, 7, 8}
var names = [3]string{1: "tom", 0: "jack", 2: "marry"}

 

 切片(slice)

 

切片是引用类型数据,存储了底层数组引用

切片是数组的一个引用,因此切片是,引用类型,在进行传递时,遵守引用 传递的机制。

切片的长度是可以变化的,因此切片是一个可以动态变化的数组。

基本语法 :

  var 变量名 []类型

定义切片的三种方式:

1.定义一个切片,然后切片去引用一个已经创建好的数组,比如前面的案例就是这样的。(数组是可见的)

2.通过make创建切片:(make会创建一个数组,但是是不可见的)

  语法:var 切片名 []type = make([]type, len, [cap])

    var slice []float64 = make([]float64, 5, 10)
    slice[1] = 10
    slice[3] = 20

    fmt.Println(slice)
    fmt.Println(len(slice))
    fmt.Println(cap(slice))

3.定义一个直接就指定具体数组,使用原理类似make的方式

append(slice, 100)

copy(slice, slice2)

4.append操作切片时(切片的尾部追加N个元素):内置函数append会首先使用可用容量,一旦没有可用容量,会分配一个新的底层数组。

5.定义公式来计算新切片的长度和容量:

slice[i:j:k]    或  slice[2:3:4]

长度:j - i 或 3-2
容量:k-i 或 4-2

6.for  range迭代切片时,第一个值是当前迭代到的索引位置,第二个值是该位置对应元素值的一份副本。

7.append为切片的头部追加N个元素(会导致内存的重新分配):

	var b = []int{11, 22, 33}
	b = append([]int{0}, b...)                        # 为b在头部添加元素0
	b = append([]int{111, 222, 333}, b...)     # 为b在头部添加元素111, 222, 333

  

 

posted @ 2019-11-07 23:29  顽强的allin  阅读(327)  评论(0编辑  收藏  举报