婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go之集合slice的實現(xiàn)

Go之集合slice的實現(xiàn)

熱門標簽:百度地圖標注位置網(wǎng)站 如何利用高德地圖標注家 上海企業(yè)外呼系統(tǒng)排名 400手機電話免費辦理 智能語音電銷的機器人 武漢百應人工智能電銷機器人 電腦外呼系統(tǒng)輻射大嗎 開通400電話申請流程 揚州電銷外呼系統(tǒng)軟件

Slice(切片)

切片和數(shù)組類似,可以把它理解為動態(tài)數(shù)組。切片是基于數(shù)組實現(xiàn)的,它的底層就是一個數(shù)組。對數(shù)組任意分隔,就可以得到一個切片。現(xiàn)在我們通過一個例子來更好地理解它,同樣還是基于前面的 array。

基于數(shù)組生成切片

下面代碼中的 array[2:5] 就是獲取一個切片的操作,它包含從數(shù)組 array 的索引 2 開始到索引 5 結束的元素:

array:=[5]string{"a","b","c","d","e"}
slice:=array[2:5]
fmt.Println(slice)

注意:這里是包含索引 2,但是不包含索引 5 的元素,即在 : 右邊的數(shù)字不會被包含。

//基于數(shù)組生成切片,包含索引start,但是不包含索引end

slice:=array[start:end]

所以 array[2:5] 獲取到的是 c、d、e 這三個元素,然后這三個元素作為一個切片賦值給變量 slice。

切片和數(shù)組一樣,也可以通過索引定位元素。這里以新獲取的 slice 切片為例,slice[0] 的值為 c,slice[1] 的值為 d。
有沒有發(fā)現(xiàn),在數(shù)組 array 中,元素 c 的索引其實是 2,但是對數(shù)組切片后,在新生成的切片 slice 中,它的索引是 0,這就是切片。雖然切片底層用的也是 array 數(shù)組,但是經(jīng)過切片后,切片的索引范圍改變了。

通過下圖可以看出,切片是一個具備三個字段的數(shù)據(jù)結構,分別是指向數(shù)組的指針 data,長度 len 和容量 cap:

這里有一些小技巧,切片表達式 array[start:end] 中的 start 和 end 索引都是可以省略的,如果省略 start,那么 start 的值默認為 0,如果省略 end,那么 end 的默認值為數(shù)組的長度。如下面的示例:

  • array[:4] 等價于 array[0:4]。
  • array[1:] 等價于 array[1:5]。
  • array[:] 等價于 array[0:5]。

切片修改

切片的值也可以被修改,這里也同時可以證明切片的底層是數(shù)組。
對切片相應的索引元素賦值就是修改,在下面的代碼中,把切片 slice 索引 1 的值修改為 f,然后打印輸出數(shù)組 array:

slice:=array[2:5]
slice[1] ="f"
fmt.Println(array)

可以看到如下結果:

[a b c f e]

數(shù)組對應的值已經(jīng)被修改為 f,所以這也證明了基于數(shù)組的切片,使用的底層數(shù)組還是原來的數(shù)組,一旦修改切片的元素值,那么底層數(shù)組對應的值也會被修改。

切片聲明

除了可以從一個數(shù)組得到切片外,還可以聲明切片,比較簡單的是使用 make 函數(shù)。
下面的代碼是聲明了一個元素類型為 string 的切片,長度是 4,make 函數(shù)還可以傳入一個容量參數(shù):

slice1:=make([]string,4)

在下面的例子中,指定了新創(chuàng)建的切片 []string 容量為 8:

slice1:=make([]string,4,8)

這里需要注意的是,切片的容量不能比切片的長度小。

切片的長度你已經(jīng)知道了,就是切片內(nèi)元素的個數(shù)。那么容量是什么呢?其實就是切片的空間。

上面的示例說明,Go 語言在內(nèi)存上劃分了一塊容量為 8 的內(nèi)容空間(容量為 8),但是只有 4 個內(nèi)存空間才有元素(長度為 4),其他的內(nèi)存空間處于空閑狀態(tài),當通過 append 函數(shù)往切片中追加元素的時候,會追加到空閑的內(nèi)存上,當切片的長度要超過容量的時候,會進行擴容。

切片不僅可以通過 make 函數(shù)聲明,也可以通過字面量的方式聲明和初始化,如下所示:

slice1:=[]string{"a","b","c","d","e"}
fmt.Println(len(slice1),cap(slice1))

可以注意到,切片和數(shù)組的字面量初始化方式,差別就是中括號 [] 里的長度。此外,通過字面量初始化的切片,長度和容量相同。

Append

我們可以通過內(nèi)置的 append 函數(shù)對一個切片追加元素,返回新切片,如下面的代碼所示:

//追加一個元素
slice2:=append(slice1,"f")
//多加多個元素
slice2:=append(slice1,"f","g")
//追加另一個切片
slice2:=append(slice1,slice...)

append 函數(shù)可以有以上三種操作,你可以根據(jù)自己的實際需求進行選擇,append 會自動處理切片容量不足需要擴容的問題。

小技巧:在創(chuàng)建新切片的時候,最好要讓新切片的長度和容量一樣,這樣在追加操作的時候就會生成新的底層數(shù)組,從而和原有數(shù)組分離,就不會因為共用底層數(shù)組導致修改內(nèi)容的時候影響多個切片。

切片元素循環(huán)

切片的循環(huán)和數(shù)組一模一樣,常用的也是 for range 方式,這里就不再進行舉例,當作練習題留給你。
在 Go 語言開發(fā)中,切片是使用最多的,尤其是作為函數(shù)的參數(shù)時,相比數(shù)組,通常會優(yōu)先選擇切片,因為它高效,內(nèi)存占用小。

到此這篇關于Go之集合slice的實現(xiàn)的文章就介紹到這了,更多相關Go 集合slice內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用go操作redis的有序集合(zset)
  • MongoDB基礎入門之創(chuàng)建、刪除集合操作
  • Go語言之自定義集合Set
  • MongoDB在不同主機間復制數(shù)據(jù)庫和集合的教程
  • 詳解MongoDB中創(chuàng)建集合與刪除集合的操作方法

標簽:江西 嘉峪關 延邊 黑龍江 宜賓 新余 武漢 張掖

巨人網(wǎng)絡通訊聲明:本文標題《Go之集合slice的實現(xiàn)》,本文關鍵詞  之,集合,slice,的,實現(xiàn),之,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go之集合slice的實現(xiàn)》相關的同類信息!
  • 本頁收集關于Go之集合slice的實現(xiàn)的相關信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章
    主站蜘蛛池模板: 黄浦区| 新乡县| 营山县| 揭阳市| 新野县| 那坡县| 紫云| 平邑县| 青铜峡市| 上思县| 民县| 子长县| 体育| 英山县| 沐川县| 西畴县| 屯门区| 长阳| 东港市| 荔波县| 剑阁县| 金昌市| 南投县| 青冈县| 静海县| 昌吉市| 保山市| 正镶白旗| 蒙城县| 米泉市| 章丘市| 彩票| 蓬莱市| 沂源县| 保靖县| 泾川县| 峨眉山市| 温泉县| 友谊县| 秀山| 乌兰县|