1. 數(shù)組
- 概念:數(shù)組是具有相同唯一類(lèi)型的一組已編號(hào)且長(zhǎng)度固定的數(shù)據(jù)項(xiàng)序列;這種類(lèi)型可以是任意的原始初始類(lèi)型,如整型,字符串或者是自定義類(lèi)型,數(shù)組的長(zhǎng)度必須是一個(gè)常量表達(dá)式,并且是一個(gè)非負(fù)整數(shù)。數(shù)組的長(zhǎng)度也是數(shù)組類(lèi)型的一部分,所以[8]int和[6]int是屬于不同類(lèi)型的。
2. 數(shù)組的聲明格式
- 格式如下
var indentifier [len] type
var a [7] int
3. 數(shù)組的初始化
var b = [5]string {"name", "age", "score", "weight", "height"}var c = []int {1, 2, 3, 4, 5}-
var d = [...]int {2, 4, 6, 8, 10}從技術(shù)角度來(lái)講d是個(gè)切片 var key = [5]string {4: "string", 6: "for"}arr := [3]float64 {12.22, 22.33, 44.55}
4. 將數(shù)組傳遞給函數(shù)
package main
import "fmt"
func main() {
arr := [3]float64 {11.22, 22.33, 33.44}
x := Sum(&arr)
fmt.Println(x)
}
func Sum(a *[3]float64) (sum float64) {
for _, v := range a {
sum +=v
}
return
}
5. 切片
- 概念:切片是對(duì)數(shù)組一個(gè)連續(xù)片段的引用,所以切片是一個(gè)引用類(lèi)型。這個(gè)片段可以是整個(gè)數(shù)組,或者是由起始和終止索引標(biāo)識(shí)的一些項(xiàng)的子集,需要注意的是,終止索引標(biāo)識(shí)的項(xiàng)不包括在切片內(nèi)。切片是可索引的,并且可以由len()函數(shù)獲取長(zhǎng)度。
- 聲明一個(gè)切片的格式如下
var indentifier []type不需要說(shuō)明長(zhǎng)度
6. 切片的內(nèi)部實(shí)現(xiàn)
- 切片是一個(gè)很小的對(duì)象,對(duì)底層數(shù)組進(jìn)行了抽象,并且提供了操作方法。
- 切片有三個(gè)字段的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)包含go語(yǔ)言需要操作底層數(shù)組的元數(shù)據(jù)
- 這三個(gè)字段分別為:指向底層數(shù)組的指針,切片訪問(wèn)的元素個(gè)數(shù)即長(zhǎng)度和允許增長(zhǎng)到元素個(gè)數(shù)及切片的容量
7. 切片的創(chuàng)建和初始化
- 使用make和切片字面量
使用make函數(shù)創(chuàng)建切片是,需要傳入一個(gè)參數(shù),指定切片的長(zhǎng)度
slice := make([]string, 5)
Note:如果只指定長(zhǎng)度,那么切片的長(zhǎng)度和容量相等 - 同時(shí)指定長(zhǎng)度和容量
slice := make([]int, 5, 10)
Note:分別指定長(zhǎng)度和容量時(shí),創(chuàng)建的切片,底層數(shù)組的長(zhǎng)度是指定的容量,但是初始化后不能訪問(wèn)所有的數(shù)組元素。需要注意的是,go語(yǔ)言不允許創(chuàng)建容量小于長(zhǎng)度的切片 - 使用切片字面量來(lái)聲明切片
slice := []int {1, 2, 3, 4, 5} - 使用切片創(chuàng)建切片
slice := []int {1, 2, 3, 4, 5, 6}
newslice := slice[1:3] - 計(jì)算切片的長(zhǎng)度和容量
對(duì)于底層數(shù)組容量是k的切片slice[i:j]來(lái)說(shuō)
長(zhǎng)度:j-i
容量:k-i - 切片增長(zhǎng)
對(duì)于數(shù)組而言,使用切片的一個(gè)好處是,可以按需增加切片的容量
go語(yǔ)言?xún)?nèi)置了append函數(shù)會(huì)處理增加長(zhǎng)度時(shí)的所有操作細(xì)節(jié)
使用append函數(shù)時(shí),只需傳入一個(gè)被操作的切片和一個(gè)要追加的值
Note:append函數(shù)總是會(huì)增加新切片的長(zhǎng)度,而容量有可能會(huì)改變,也有可能不會(huì)改變,這取決于被操作的切片的可用容量
slice := []int {1, 2, 3, 4, 5, 6, 7}
slice = append(slice, 8)
8. 迭代切片
slice := {1, 3, 5, 7, 9}
for _, v := range slice {
fmt.Println(v)
}
9. 在函數(shù)中傳遞切片
- 在函數(shù)中傳遞切片就是要在函數(shù)間以值的方式傳遞切片。由于切片的尺寸很小,在函數(shù)間復(fù)制和傳遞的成本很低
slice := make([]int, 12)
slice = foo(slice)
func foo(slice []int) []int {
...
return slice
}
that's all