Golang數(shù)組類型

數(shù)組

數(shù)組是指一系列同一類型數(shù)據(jù)的集合。數(shù)組中包含的每個(gè)數(shù)據(jù)被稱為數(shù)組元素(element),一個(gè)數(shù)組包含的元素個(gè)數(shù)被稱為數(shù)組的長(zhǎng)度。

1. 聲明方法

[32]byte                   //長(zhǎng)度為32的數(shù)組
[2*N] struct {x, y int32}  //復(fù)雜類型數(shù)組
[100]*float64              //指針數(shù)組
[3][5]int                  //二維數(shù)組
[2][2][2]float64           //等同于[2]([2]([2]float64))

數(shù)組的長(zhǎng)度在聲明時(shí)就已經(jīng)確定,后面不能再次修改??梢允褂?code>len()函數(shù)來(lái)求數(shù)組的長(zhǎng)度。

2. 元素訪問(wèn)

使用下標(biāo)訪問(wèn)數(shù)組,同C語(yǔ)言一樣,下標(biāo)也是從0開(kāi)始

for i := 0; i < len(array); i++ {
    fmt.Println("Element", i, "of array is", array[i])
}

當(dāng)然,我們也可以使用Go語(yǔ)言提供的range關(guān)鍵字來(lái)遍歷數(shù)組。

for i, v := range array {
    fmt.Println("Element", i, "of array is", v)
}

3.值類型

Go語(yǔ)言中,數(shù)組是值類型,作為參數(shù)傳遞時(shí),都會(huì)產(chǎn)生一次復(fù)制動(dòng)作。所以,在函數(shù)中不能
將數(shù)組作為參數(shù)傳遞,因?yàn)樵诤瘮?shù)中操作的只不過(guò)是數(shù)組的副本而已。

package main

import "fmt"

func modify(array [5]int) {
    array[0] = 10
    fmt.Println("In Modify, array values:", array)
}

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    modify(array)
    fmt.Println("In Main, array values:", array)
}

它的輸出為:

In Modify, array values: [10 2 3 4 5]
In Main, array values: [1 2 3 4 5]

4.數(shù)組切片

在前面我們提到,數(shù)組有兩個(gè)特性

  • 數(shù)組長(zhǎng)度在定義后無(wú)法改變
  • 數(shù)組是值類型,在參數(shù)傳遞時(shí)會(huì)產(chǎn)生副本。
    這兩大特性使得數(shù)組無(wú)法適應(yīng)開(kāi)發(fā)者的真實(shí)需求。所以我們使用數(shù)組切片(Slice)來(lái)彌補(bǔ)
    數(shù)組的不足。
    從底層的角度看,數(shù)組切片仍然使用數(shù)組來(lái)管理元素?;跀?shù)組,數(shù)組切片添加了一系列管理功能??梢噪S時(shí)動(dòng)態(tài)擴(kuò)充存放空間。并且在傳參時(shí)不會(huì)產(chǎn)生復(fù)制。

4.1 基于數(shù)組創(chuàng)建數(shù)組切片

var marr [5]int = [5]int{1, 2, 3, 4, 5}
var mSlice []int = marr[:3]

Golang支持使用Array[first:last]的方式來(lái)基于數(shù)組生成一個(gè)數(shù)組切片。

4.2 直接創(chuàng)建數(shù)組切片

mySlice1 := make([]int, 5) //創(chuàng)建一個(gè)初始元素為5的數(shù)組切片,元素初始值為0
mySlice2 := make([]int, 5, 10)  //創(chuàng)建一個(gè)初始元素為5的數(shù)組切片,元素初始值為0,并且預(yù)留10個(gè)元素空間。
mySlice3 := []int{1, 2, 3, 4, 5} //創(chuàng)建,并初始化一個(gè)數(shù)組切片

4.3 遍歷

同數(shù)組一樣,我們可以使用下標(biāo)或者range的方式遍歷數(shù)組切片

4.4 動(dòng)態(tài)增減元素

Go語(yǔ)言內(nèi)置len()和cap()方法。len()函數(shù)返回?cái)?shù)組切片當(dāng)前存儲(chǔ)的元素個(gè)數(shù),cap()函數(shù)返回?cái)?shù)組切片分配的空間大小。例如:

mySlice := make([]int, 5, 10)
len(mySlice) //5
cap(mySlice) //10

4.4.1 新增元素

如果想往上面的mySlice數(shù)組切片添加元素,可以使用append()函數(shù)。

mySlice = append(mySlice, 1, 2, 3) //mySlice末尾添加三個(gè)元素
mySlice2 := []int{8, 9, 10}
mySlice = append(mySlice, mySlice2...)  //將mySlice2數(shù)組切片添加到mySlice末尾。

5. 內(nèi)容復(fù)制

Go語(yǔ)言另一個(gè)內(nèi)置函數(shù)copy(),用于將內(nèi)容從一個(gè)數(shù)組切片復(fù)制到另一個(gè)數(shù)組切片。如果兩個(gè)數(shù)組切片不一樣大。如果加入兩數(shù)組切片不一樣大,就會(huì)按較小的那個(gè)數(shù)組切片的元素個(gè)數(shù)進(jìn)行復(fù)制。

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}

copy(slice2, slice1) //只會(huì)復(fù)制slice1前三個(gè)元素到slice2中
copy(slice1, slice2) //只會(huì)復(fù)制slice2的3個(gè)元素到slice1的前三個(gè)位置。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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