Go語言-數(shù)組和切片

1 數(shù)組的定義

定義數(shù)組常規(guī)格式是:var 數(shù)組名 [元素?cái)?shù)量] 元素類型 = {各元素},實(shí)際使用中,可以有很多靈活的操作。如有下面幾種定義數(shù)組的方式:

  • 只聲明不賦值
  • 使用語法糖:=以省略var關(guān)鍵字,此時(shí)需要對數(shù)組進(jìn)行賦值
  • 使用...在定義的時(shí)候不指定個(gè)數(shù),由程序通過所賦值的結(jié)果自己計(jì)算。定義時(shí)候需要賦值!

下面是幾種定義方式的實(shí)現(xiàn)案例:

package main

import "fmt"

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

// 二維數(shù)組的定義分別代表行列數(shù)
    var grid [4][5]int
    
    fmt.Println(arr1,arr2,arr3)
    fmt.Println(grid)
}

程序的輸出結(jié)果是:


說明
數(shù)組定義需要在元素類型前面加上[...]或者[數(shù)字],需要注意的是,在使用的時(shí)候,如果方括號中間不帶任何東西,那么他代表的是一個(gè)數(shù)組的切片,就不是指這個(gè)數(shù)組了。所以,需要在定義一個(gè)含有數(shù)組參數(shù)的函數(shù)時(shí),需要帶上方括號內(nèi)的東西。

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

2 數(shù)組的遍歷

數(shù)組的遍歷可以采用常規(guī)的for - len的形式,不過建議還是使用Go語言中提供的range方法,該關(guān)鍵字能夠直接獲取到數(shù)組的下標(biāo)和對應(yīng)的元素值。例如:

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

程序?qū)?yīng)的輸出結(jié)果是:


當(dāng)然,可以直接獲取下標(biāo),另外通過arr3[i]的方式獲取元素。

說明
需要注意的是:數(shù)組也是值傳遞的。在函數(shù)內(nèi)部修改一個(gè)數(shù)組,如果不是從地址層面進(jìn)行了修改。那么脫離了函數(shù)之后,不會(huì)影響老數(shù)組。也就是說,func f(arr [10]int)會(huì)拷貝數(shù)組


Go語言中一般不直接使用數(shù)組,而是使用切片。下一節(jié)著重介紹切片的概念。

3 切片:slice

所謂切片是指取數(shù)組的一小段數(shù)組元組子集。slice是對數(shù)組的一個(gè)view(視圖)。

首先定義一個(gè)數(shù)組arr:=[...]int{0,1,2,3,4,5,6,7},取一個(gè)切片s:=arr[2:6],s就是一個(gè)切片。s的取值是[2,6),因此,s這個(gè)切片的取值是:[2,3,4,5]

同樣的,可以省略切片的start或者end,或者 全部省略代表全部數(shù)組元素。

以切片為參數(shù)的時(shí)候,方括號內(nèi)部不用加數(shù)字。

更新某個(gè)數(shù)組的切片,是會(huì)更新數(shù)組內(nèi)容的。

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)
    
}

上述程序的輸出結(jié)果是:


也就是說,切片作為參數(shù)實(shí)現(xiàn)了數(shù)組指針作為參數(shù)的作用。但是省卻了很多的麻煩寫法。

3.1 Slice的上下限和容量

切片中的概念

slice中有三個(gè)概念:指針,長度和容量
參照上圖可知:

  • ptr:一個(gè)切片的起始內(nèi)存地址
  • len:一個(gè)切片的長度:也就是這個(gè)切片中的當(dāng)前元素個(gè)數(shù)
  • cap:一個(gè)切片的擴(kuò)展后的總?cè)萘?/li>

切片是基于數(shù)組的視圖,所以,有一定的可見域。如果切片的下界超過了數(shù)組的最終容量,只會(huì)顯示到數(shù)組的最后元素完成后就結(jié)束。

1. slice可以向后擴(kuò)展,不可以向前擴(kuò)展

  1. s[i] 不可以超越len(s),向后擴(kuò)展不可以超越底層數(shù)組cap(s)。

3.2 向slice中添加元素

  • 添加元素的時(shí)候如果超越cap,系統(tǒng)會(huì)重新分配更大的底層數(shù)組
  • 由于值傳遞的關(guān)系,必須接收append的返回值
  • s = append(s,val)

一種創(chuàng)建切片的方法: 使用系統(tǒng)內(nèi)置的make方法。

// 創(chuàng)建一個(gè)長度為10的切片,默認(rèn)值都是元素0
s := make([]int, 10)
// 創(chuàng)建一個(gè)長度為10, 容量為32的切片,默認(rèn)值都是元素0
s := make([]int, 10, 32)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容