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...