陣列與切片

2021-08-28 07:38:20 字數 2296 閱讀 1083

1、陣列

在go語言裡,陣列是乙個長度固定的資料型別,用於儲存一段具有相同的型別的元素的連續塊。陣列儲存的型別可以是內建型別,如整型或者字串,也可以是某種結構型別。

1)陣列的建立

//先宣告,再賦值

var array [5]int

array[1] = 3

//建立固定長度的陣列

array := [5]int

//陣列長度由初始化值的數量決定

array := [...]int

其底層為:

2)在函式間傳遞陣列

根據記憶體和效能來看,在函式間傳遞陣列是乙個開銷很大的操作。在函式間傳遞變數時,總是以值的方式傳遞的。如果變數是乙個陣列,意味著整個陣列,不管有多長,都會完整複製,並傳遞給函式。

// 宣告乙個需要 8m 的陣列

var array [1e6]int

//將陣列傳遞給函式 foo

foo(array)

//函式foo接受乙個100萬個整型值的陣列

func foo (array [1e6]int)

從上面的**可知,每次函式 foo被呼叫時,必須在棧上分配8m的記憶體。之後,整個陣列的值(8m的記憶體)被複製到剛分配的記憶體裡。為了效能考慮,可以只傳入陣列的指標,這樣只需要複製8位元組的資料而不是8mb的記憶體資料到棧上。

// 宣告乙個需要 8m 的陣列

var array [1e6]int

//將陣列傳遞給函式 foo

foo(&array)

//函式foo接受乙個100萬個整型值的陣列

func foo (array *[1e6]int)

//切片的長度和容量都是5個元素

slicie := make(string,5)

//切片的長度為3,容量為5

slicie := make(string,3,5)

注意陣列和切片的宣告的不同

//建立有3個元素的整型陣列

array := [3]int

//建立長度和容量都是3的整型切片

slice := int

使用切片建立切片

//建立長度和容量都是5的整型切片

slice := int

//建立長度為2個元素,容量為4個元素的切片

newslice := slice[1:3]

其底層為:

對底層陣列容量為k的切片 slice[i:j]來說,

長度: j - i

容量:k - i

2) 修改切片內容可能導致的結果

slice := int

newslice := slice[1:3]

newslice[1] = 35

package main

import "fmt"

func main()

for index,value := range slice

}

其執行結果為:

原因:

range 建立了每個元素的副本,而不是直接返回對該元素的引用。在迭代過程中,其返回的變數是乙個迭代過程中根據切片依次賦值的新變數,所以value的位址總是相同的,要想獲取每個變數的位址,可以使用切片變數和索引值。

5)在函式間傳遞切片

在函式間傳遞切片就是以值的方式傳遞切片。在64位架構的機器上,乙個切片需要24位元組的記憶體:指標字段需要8位元組,長度和容量分別需要8位元組。由於和切片相關聯的資料報含在底層陣列裡,不屬於切片本身,所以講切片複製到任意函式的時候,對底層陣列大小都不會有影響。複製時只會複製切片本身,不會涉及底層陣列。

陣列與切片

1 在golang中陣列與切片的定義 在golang中,有乙個 罕見 的復合型別,叫切片,切片是基於陣列的,golang和其它語言不一樣,在golang中,陣列是不可變的,對陣列進行型別轉換等操作都會導致golang隱式的申請一塊記憶體,然後將原陣列的內容複製到這塊記憶體。在實際的開發當中,我們經常...

go陣列與切片

go陣列 陣列宣告 var variable name size variable type eg var balance 10 float32 陣列初始化 var balance 5 float32 初始化陣列中 中的元素個數不能大於 中的數字。如果忽略 中的數字不設定陣列大小,go 語言會根據元...

go陣列與切片

陣列是具有相同唯一型別的一組長度固定的資料項序列,這種型別可以是任意的原始型別,例如整形,字元型或者自定義型別。陣列長度必須是乙個常量的表示式,並且是乙個非負整數。陣列元素可以用個索引累讀取,陣列長度最大為2gb。宣告格式為 var identifier len type 複製 例如 var arr...