Go语言-数组和切片

2018-10-06  本文已影响0人  小孩真笨

1 数组的定义

定义数组常规格式是:var 数组名 [元素数量] 元素类型 = {各元素},实际使用中,可以有很多灵活的操作。如有下面几种定义数组的方式:

下面是几种定义方式的实现案例:

package main

import "fmt"

func main() {
    var arr1 [5] int
    arr2 := [3]int{1,2,3}
    arr3 := [...]int{3,2,32,465,64,3}

// 二维数组的定义分别代表行列数
    var grid [4][5]int
    
    fmt.Println(arr1,arr2,arr3)
    fmt.Println(grid)
}

程序的输出结果是:


说明
数组定义需要在元素类型前面加上[...]或者[数字],需要注意的是,在使用的时候,如果方括号中间不带任何东西,那么他代表的是一个数组的切片,就不是指这个数组了。所以,需要在定义一个含有数组参数的函数时,需要带上方括号内的东西。

[10]int和[20]int是不同的类型

2 数组的遍历

数组的遍历可以采用常规的for - len的形式,不过建议还是使用Go语言中提供的range方法,该关键字能够直接获取到数组的下标和对应的元素值。例如:

for i, v := range arr3 {
        fmt.Println(i, "->", v)
}

程序对应的输出结果是:


当然,可以直接获取下标,另外通过arr3[i]的方式获取元素。

说明
需要注意的是:数组也是值传递的。在函数内部修改一个数组,如果不是从地址层面进行了修改。那么脱离了函数之后,不会影响老数组。也就是说,func f(arr [10]int)拷贝数组


Go语言中一般不直接使用数组,而是使用切片。下一节着重介绍切片的概念。

3 切片:slice

所谓切片是指取数组的一小段数组元组子集。slice是对数组的一个view(视图)。

首先定义一个数组arr:=[...]int{0,1,2,3,4,5,6,7},取一个切片s:=arr[2:6],s就是一个切片。s的取值是[2,6),因此,s这个切片的取值是:[2,3,4,5]

同样的,可以省略切片的start或者end,或者 全部省略代表全部数组元素。

以切片为参数的时候,方括号内部不用加数字。

更新某个数组的切片,是会更新数组内容的。

package main

import "fmt"

func printArray(arr []int){
    arr[0]=100
    for i,v :=range arr{
        fmt.Println(i,"->",v)
    }
}

func main() {
    var arr1 = [5]int {1,2,3,4,5}

    slice:=arr1[:]

    fmt.Println("更新之前...")
    fmt.Println(arr1)

    fmt.Println("======================")
    printArray(slice)

    fmt.Println("更新之后...")
    fmt.Println(arr1)
    
}

上述程序的输出结果是:


也就是说,切片作为参数实现了数组指针作为参数的作用。但是省却了很多的麻烦写法。

3.1 Slice的上下限和容量

切片中的概念

slice中有三个概念:指针,长度和容量
参照上图可知:

切片是基于数组的视图,所以,有一定的可见域。如果切片的下界超过了数组的最终容量,只会显示到数组的最后元素完成后就结束。

1. slice可以向后扩展,不可以向前扩展

  1. s[i] 不可以超越len(s),向后扩展不可以超越底层数组cap(s)。

3.2 向slice中添加元素

一种创建切片的方法: 使用系统内置的make方法。

// 创建一个长度为10的切片,默认值都是元素0
s := make([]int, 10)
// 创建一个长度为10, 容量为32的切片,默认值都是元素0
s := make([]int, 10, 32)
上一篇下一篇

猜你喜欢

热点阅读