在golang中,切片是對(duì)數(shù)組的一個(gè)連續(xù)片段的引用,這個(gè)片段可以是整個(gè)數(shù)組,也可以是由起始和終止索引標(biāo)識(shí)的一些項(xiàng)的子集。Go語言中切片的內(nèi)部結(jié)構(gòu)包含地址、大小和容量,切片一般用于快速地操作一塊數(shù)據(jù)集合,如果將數(shù)據(jù)集合比作切糕的話,切片就是你要的“那一塊”,切的過程包含從哪里開始(切片的起始位置)及切多大(切片的大?。?,容量可以理解為裝切片的口袋大小。
php入門到就業(yè)線上直播課:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
切片(slice)是對(duì)數(shù)組的一個(gè)連續(xù)片段的引用,所以切片是一個(gè)引用類型(因此更類似于 C/C++ 中的數(shù)組類型,或者 Python 中的 list 類型),這個(gè)片段可以是整個(gè)數(shù)組,也可以是由起始和終止索引標(biāo)識(shí)的一些項(xiàng)的子集,需要注意的是,終止索引標(biāo)識(shí)的項(xiàng)不包括在切片內(nèi)。
Go語言中切片的內(nèi)部結(jié)構(gòu)包含地址、大小和容量,切片一般用于快速地操作一塊數(shù)據(jù)集合,如果將數(shù)據(jù)集合比作切糕的話,切片就是你要的“那一塊”,切的過程包含從哪里開始(切片的起始位置)及切多大(切片的大小),容量可以理解為裝切片的口袋大小,如下圖所示。
圖:切片結(jié)構(gòu)和內(nèi)存分配
從數(shù)組或切片生成新的切片
切片默認(rèn)指向一段連續(xù)內(nèi)存區(qū)域,可以是數(shù)組,也可以是切片本身。
從連續(xù)內(nèi)存區(qū)域生成切片是常見的操作,格式如下:
slice [開始位置 : 結(jié)束位置]
語法說明如下:
-
slice:表示目標(biāo)切片對(duì)象;
-
開始位置:對(duì)應(yīng)目標(biāo)切片對(duì)象的索引;
-
結(jié)束位置:對(duì)應(yīng)目標(biāo)切片的結(jié)束索引。
從數(shù)組生成切片,代碼如下:
var a = [3]int{1, 2, 3} fmt.Println(a, a[1:2])
其中 a 是一個(gè)擁有 3 個(gè)整型元素的數(shù)組,被初始化為數(shù)值 1 到 3,使用 a[1:2] 可以生成一個(gè)新的切片,代碼運(yùn)行結(jié)果如下:
[1 2 3] [2]
其中 [2] 就是 a[1:2] 切片操作的結(jié)果。
從數(shù)組或切片生成新的切片擁有如下特性:
-
取出的元素?cái)?shù)量為:結(jié)束位置 – 開始位置;
-
取出元素不包含結(jié)束位置對(duì)應(yīng)的索引,切片最后一個(gè)元素使用 slice[len(slice)] 獲取;
-
當(dāng)缺省開始位置時(shí),表示從連續(xù)區(qū)域開頭到結(jié)束位置;
-
當(dāng)缺省結(jié)束位置時(shí),表示從開始位置到整個(gè)連續(xù)區(qū)域末尾;
-
兩者同時(shí)缺省時(shí),與切片本身等效;
-
兩者同時(shí)為 0 時(shí),等效于空切片,一般用于切片復(fù)位。
根據(jù)索引位置取切片 slice 元素值時(shí),取值范圍是(0~len(slice)-1),超界會(huì)報(bào)運(yùn)行時(shí)錯(cuò)誤,生成切片時(shí),結(jié)束位置可以填寫 len(slice) 但不會(huì)報(bào)錯(cuò)?!?/p>