Go學習筆記 陣列和切片

2021-08-29 02:52:10 字數 2620 閱讀 7199

陣列型別的值(以下簡稱陣列)的長度是固定的,而切片型別的值(以下簡稱切片)是可變長的。

陣列的長度在宣告它的時候就必須給定,並且在之後不會再改變。可以說,陣列的長度是其型別的一部分。

go 語言的切片型別屬於引用型別,同屬引用型別的還有後面會講到的字典型別、通道型別、函式型別等;而 go 語言的陣列型別則屬於值型別,同屬值型別的有基礎資料型別以及結構體型別。

go 語言中,我們判斷所謂的「傳值」或者「傳引用」只要看被傳遞的值的型別。

如果傳遞的值是引用型別的,那麼就是「傳引用」。如果傳遞的值是值型別的,那麼就是「傳值」。從傳遞成本的角度講,引用型別的值往往要比值型別的值低很多。

當我們用make函式初始化切片時,如果不指明其容量,那麼它就會和長度一致。如果在初始化時指明了容量,那麼切片的實際容量也就是它了。

怎樣估算切片容量的增長?

一旦乙個切片無法容納更多的元素,go 語言就會想辦法擴容。但它並不會改變原來的切片,而是會生成乙個容量更大的切片,然後將把原有的元素和新元素一併拷貝到新切片中。

在一般的情況下,你可以簡單地認為新切片的容量(以下簡稱新容量)將會是原切片容量(以下簡稱原容量)的 2 倍。

但是,當原切片的長度(以下簡稱原長度)大於或等於1024時,go 語言將會以原容量的1.25倍作為新容量的基準(以下新容量基準)。

新容量基準會被調整(不斷地與1.25相乘),直到結果不小於原長度與要追加的元素數量之和(以下簡稱新長度)。最終,新容量往往會比新長度大一些,當然,相等也是可能的。

練習:

package main

import "fmt"

func main()

fmt.println(total / float64(len(x))) //因為total是float64,len(x)是int,所以需要顯示的進行轉換

fmt.println("-------------------")

//range在陣列中的使用

var total2 float64 = 0

for _, value := range x

fmt.println(total2 / float64(len(x)))

fmt.println("------------------")

x2 := [5]float64

var total3 float64 = 0

for _, value := range x2

fmt.println(total3 / float64(len(x2)))

fmt.println("------------------")

/* slice

*/ //通過make進行建立:

slice1 := int

fmt.println(slice1, slice2) //[1 2 3] [1 2 3 4 5]

//copy函式

fmt.println("-----------------")

slice3 := int

slice4 := make(int, 2)

copy(slice4, slice3)

fmt.println(slice3, slice4) //[1 2 3] [1 2]

fmt.println("-------------------")

// here we create an array `a` that will hold exactly

// 5 `int`s. the type of elements and length are both

// part of the array's type. by default an array is

// zero-valued, which for `int`s means `0`s.

var a [5]int

fmt.println("emp:", a)

// we can set a value at an index using the

// `array[index] = value` syntax, and get a value with

// `array[index]`.

a[4] = 100

fmt.println("set:", a)

fmt.println("get:", a[4])

// the builtin `len` returns the length of an array.

fmt.println("len:", len(a))

// use this syntax to declare and initialize an array

// in one line.

b := [5]int

fmt.println("dcl:", b)

// array types are one-dimensional, but you can

// compose types to build multi-dimensional data

// structures.

var twod [2][3]int

for i := 0; i < 2; i++

} fmt.println("2d: ", twod)

}

Go學習筆記 陣列和切片

陣列 陣列是具有相同唯一型別的一組已編號且長度固定的資料項序列 同構的資料結構 這種型別可以是任意的原始型別,例如整型 字串或者自定義型別。陣列長度必須是乙個常量表示式,並且必須是乙個非負整數。陣列成都也是陣列型別的一部分,所以 5 int和 10 int是屬於不同型別的。陣列是一種值型別。陣列的編...

go語言筆記(陣列 切片)

var a 4 int 定義長度為4,型別為int的陣列,沒有初始化時就是預設值 b 4 int 定義的時候同時初值化 c 4 int 通過索引指定初始化 d int 可以不定義陣列的長度,但是要初始化 fmt.println a,b,c,d 執行結果 0 0 0 0 1 2 3 4 2 0 0 5...

Go 學習筆記 04 陣列 切片

陣列長度指定之後,不可修改。會自行推斷陣列長度。var arr int指定索引值來初始化陣列。arr int輸出 1 20 20 0 0 50 基本資料型別和陣列都是值型別,是引用型別。golang 中申明切片之後,切片預設值就是nil。len 取長度,cap 求切片的容量。定義切片的時候,把陣列長...