go語言的切片,go語言切片擴(kuò)容

Golang|切片原理

在Golang語言開發(fā)過程中,我們經(jīng)常會(huì)用到數(shù)組和切片數(shù)據(jù)結(jié)構(gòu),數(shù)組是固定長度的,而切片是可以擴(kuò)張的數(shù)組,那么切片底層到底有什么不同?接下來我們來詳細(xì)分析一下內(nèi)部實(shí)現(xiàn)。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站制作、游仙網(wǎng)絡(luò)推廣、小程序制作、游仙網(wǎng)絡(luò)營銷、游仙企業(yè)策劃、游仙品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供游仙建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

首先我們來看一下數(shù)據(jù)結(jié)構(gòu)

這里的array其實(shí)是指向切片管理的內(nèi)存塊首地址,而len就是切片的實(shí)際使用大小,cap就是切片的容量。

我們可以通過下面的代碼輸出slice:

這么分析下來,我們可以了解如下內(nèi)容:

使用一個(gè)切片通常有兩種方法:

另一種是slice = make([]int, len, cap)這種方法,稱為分配內(nèi)存。

創(chuàng)建一個(gè)slice,實(shí)質(zhì)上是在分配內(nèi)存。

這里跟一下細(xì)節(jié),math.MulUintptr是基于底層的指針計(jì)算乘法的,這樣計(jì)算不會(huì)導(dǎo)致超出int大小,這個(gè)方法在后面會(huì)經(jīng)常用到。

同樣,對于int64的長度,也有對應(yīng)的方法

而實(shí)際分配內(nèi)存的操作調(diào)用mallocgc這個(gè)分配內(nèi)存的函數(shù),這個(gè)函數(shù)以后再分析。

我們了解切片和數(shù)組最大的不同就是切片能夠自動(dòng)擴(kuò)容,接下來看看切片是如何擴(kuò)容的

這里可以看到,growslice是返回了一個(gè)新的slice,也就是說如果發(fā)生了擴(kuò)容,會(huì)發(fā)生拷貝。

所以我們在使用過程中,如果預(yù)先知道容量,可以預(yù)先分配好容量再使用,能提高運(yùn)行效率。

copy這個(gè)函數(shù)在內(nèi)部實(shí)現(xiàn)為slicecopy

還有關(guān)于字符串的拷貝

這里顯示了可以把string拷貝成[]byte,不能把[]byte拷貝成string。

1、切片的數(shù)據(jù)結(jié)構(gòu)是 array內(nèi)存地址,len長度,cap容量

2、make的時(shí)候需要注意 容量 * 長度 分配的內(nèi)存大小要小于264,并且要小于可分配的內(nèi)存量,同時(shí)長度不能大于容量。

3、內(nèi)存增長的過程:

4、當(dāng)發(fā)生內(nèi)存擴(kuò)容時(shí),會(huì)發(fā)生拷貝數(shù)據(jù)的現(xiàn)象,影響程序運(yùn)行的效率,如果可以,要先分配好指定的容量

5、關(guān)于拷貝,可以把string拷貝成[]byte,不能把[]byte拷貝成string。

go語言中實(shí)現(xiàn)切片(slice)的三種方式

定義一個(gè)切片,然后讓切片去引用一個(gè)已經(jīng)創(chuàng)建好的數(shù)組?;菊Z法如下:

索引1:切片引用的起始元素位

索引2:切片只引用該元素位之前的元素

例程如下:

在該方法中,我們未指定容量cap,這里的值為5是系統(tǒng)定義的。

在方法一中,可以用arr數(shù)組名來操控?cái)?shù)組中的元素,也可以通過slice切片來操控?cái)?shù)組中的元素。切片是直接引用數(shù)組,數(shù)組是事先存在的,程序員是可見的。

通過 make 來創(chuàng)建切片,基本語法如下:

make函數(shù)第三個(gè)參數(shù)cap即容量是可選的,如果一定要自己注明的話,要注意保證cap≥len。

用該方法可以 指定切片的大小(len)和容量(cap)

例程如下:

由于未賦值系統(tǒng)默認(rèn)將元素值置為0,即:

數(shù)值類型數(shù)組:????默認(rèn)值為 0

字符串?dāng)?shù)組:? ? ? ?默認(rèn)值為 ""

bool數(shù)組:? ? ? ? ? ?默認(rèn)值為 false

在方法二中,通過make方式創(chuàng)建的切片對應(yīng)的數(shù)組是由make底層維護(hù),對外不可見,即只能通過slice去訪問各個(gè)元素。

定義一個(gè)切片,直接就指定具體數(shù)組,使用原理類似于make的方式。

例程如下:

Go語言 排序與搜索切片

Go語言標(biāo)準(zhǔn)庫中提供了sort包對整型,浮點(diǎn)型,字符串型切片進(jìn)行排序,檢查一個(gè)切片是否排好序,使用二分法搜索函數(shù)在一個(gè)有序切片中搜索一個(gè)元素等功能。

關(guān)于sort包內(nèi)的函數(shù)說明與使用,請查看

在這里簡單講幾個(gè)sort包中常用的函數(shù)

在Go語言中,對字符串的排序都是按照字節(jié)排序,也就是說在對字符串排序時(shí)是區(qū)分大小寫的。

二分搜索算法

Go語言中提供了一個(gè)使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個(gè)元素,其中n為切片中元素的總數(shù)。

sort.Search(size,fn)函數(shù)接受兩個(gè)參數(shù):所處理的切片的長度和一個(gè)將目標(biāo)元素與有序切片的元素相比較的函數(shù),該函數(shù)是一個(gè)閉包,如果該有序切片是升序排列,那么在判斷時(shí)使用 有序切片的元素 = 目標(biāo)元素。該函數(shù)返回一個(gè)int值,表示與目標(biāo)元素相同的切片元素的索引。

在切片中查找出某個(gè)與目標(biāo)字符串相同的元素索引

分享題目:go語言的切片,go語言切片擴(kuò)容
網(wǎng)頁地址:http://muchs.cn/article28/hcjjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站改版、響應(yīng)式網(wǎng)站、企業(yè)建站、靜態(tài)網(wǎng)站營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司