十六 GO語言的陣列和切片 slice

2022-09-14 13:24:08 字數 2609 閱讀 8098

1.陣列

陣列可以存放多個同樣的資料型別資料,陣列也是一種資料型別,在go中,陣列是值型別

陣列的定義

語法:var 陣列名 [陣列大小]資料型別

示例:var array [5]int

賦值:array[0] = 1 a[1] = 30  //中括號中輸入的是陣列中元素的下標,從0開始,0就是第乙個元素

上圖中,前面三種都是順序賦值,第四種在初始化時指定給某乙個元素賦值,

如果不寫長度  var numarr05 = int,則會被定義成是乙個切片

陣列的記憶體位址就是陣列中第乙個元素的位址,陣列元素的記憶體位址是連續的,取陣列元素時,實際上是在取到首元素位址後,根據資料型別增加相應的記憶體位址即可,比如int64型別的陣列,則每次增加8個位元組即可取到下乙個元素,int32型別的陣列則每次增加4個位元組取下乙個元素

可以仔細觀察下圖中最後一行輸出每個位址的最後兩位 a0=>a8=>b0

因為陣列是值型別,預設情況下陣列在呼叫函式傳參的時候,是進行的值拷貝,函式的內部棧會對資料拷貝乙份放到內部,在函式內改變陣列的值,不會修改外部陣列的值,如果想要進行改變,則可以進行指標傳遞

2.切片(slice)

為什麼需要切片?

因為陣列在建立時長度必須確定,但是某些情況下,我們並不能確定長度是多少

切片可以簡單理解為動態陣列,但是跟陣列有一定區別

1.切片是陣列的乙個引用,因此切片是引用型別,在進行傳遞時,遵守引用傳遞的機制

2.切片的使用和陣列類似,遍歷切片和訪問切片的元素和求切片長度都和陣列是一樣的

3.切片的長度是可以變化的,因此切片是乙個可以動態變化的陣列

4.切片定義的基本語法

第一種:由陣列中提取部分元素來建立切片

var 切片名 型別:如 var a int(跟陣列的區別是(中括號)中不需要寫長度)

cap()是乙個內建函式,該函式返回的是引數的容量,切片的容量和實際長度是不一樣的。

輸出結果

第二種:使用make函式建立切片

var 切片名 型別 = make(型別,長度,[容量]) 

說明:容量為可選引數,不傳則預設長度為切片的容量

第三種:定義乙個切片,直接就指定具體陣列,使用原理類似make的方式

輸出結果:

沒有指定容量,則容量預設是陣列長度

切片的擴容機制

切片的容量會根據長度自動擴充,當長度超過容量的時候,

如果需要的容量超過原切片容量的兩倍時,會使用需要的容量作為新容量。

如果切片的容量小於1024會直接翻倍,如果超過1024會按照每次25%來增加,直到容量超過長度

切片實際上就是乙個結構體,該結構體包含指向陣列的指標,長度,容量3個字段

每次擴容都是建立了乙個新的陣列,擴容後修改切片的元素值,如果切片原本是引用乙個陣列,則不會影響原陣列的值

為了避免因為切片是否發生擴容的問題導致bug,最好的處理辦法還是在必要時使用copy來複製資料,保證得到乙個新的切片,以避免後續操作帶來預料之外的***。

切片的動態追加

所以在追加後需要接收這個新的陣列

也可以直接追加乙個切片(...為固定寫法)

切片的拷貝操作

copy()內建函式

copy(slice2,slice1)  //把slice1的值拷貝到slice2

copy函式要求引數均為切片型別,不能是陣列,拷貝後,兩個切片互不影響,均擁有自己的底層陣列記憶體空間

如果第乙個引數的長度小於第二個,則會按照第乙個引數的長度拷貝相應數量的值

切片跟陣列不同是引用型別,所以在函式呼叫的時候,函式內部修改元素值,外部的切片也會同步進行更改。

切片的擴充套件使用

因為string底層是乙個byte陣列,因此切片可以用來擷取字串

go語言 陣列和切片

目錄切片 var variable name size variable type 預設值為0eg var ss 10 int var s1 5 int方法一 for i 0 i len arry i 方法二 for index,value range array 儲存了三個一維陣列,每個一位陣列長...

go 語言的陣列切片

建立陣列切片兩種方法 第一種是基與陣列,第二種是直接建立 1.第一種如下 定義乙個陣列 var myarray 10 int 10 int 基與myarray的前5個元素建立陣列切片 myslice myarray 5 基與從第5個元素開始的所有元素建立陣列切片 myslice myarray 5 ...

go語言的陣列和切片區別

這裡不介紹陣列和切片的使用技巧,主要看下2者的區別。首先看下它們的定義 看乙個陣列的例子 varx 3 int 3 int vary 3 int x fmt.println x,y y 0 999 fmt.println x,y 輸出結果如下,可以發現y的內容變了,但是x沒有變 1 2 3 1 2 ...