在Golang語言開發(fā)過程中,我們經常會用到數組和切片數據結構,數組是固定長度的,而切片是可以擴張的數組,那么切片底層到底有什么不同?接下來我們來詳細分析一下內部實現。

創(chuàng)新互聯建站專注為客戶提供全方位的互聯網綜合服務,包含不限于網站建設、網站制作、游仙網絡推廣、小程序制作、游仙網絡營銷、游仙企業(yè)策劃、游仙品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯建站為所有大學生創(chuàng)業(yè)者提供游仙建站搭建服務,24小時服務熱線:028-86922220,官方網址:chinadenli.net
首先我們來看一下數據結構
這里的array其實是指向切片管理的內存塊首地址,而len就是切片的實際使用大小,cap就是切片的容量。
我們可以通過下面的代碼輸出slice:
這么分析下來,我們可以了解如下內容:
使用一個切片通常有兩種方法:
另一種是slice = make([]int, len, cap)這種方法,稱為分配內存。
創(chuàng)建一個slice,實質上是在分配內存。
這里跟一下細節(jié),math.MulUintptr是基于底層的指針計算乘法的,這樣計算不會導致超出int大小,這個方法在后面會經常用到。
同樣,對于int64的長度,也有對應的方法
而實際分配內存的操作調用mallocgc這個分配內存的函數,這個函數以后再分析。
我們了解切片和數組最大的不同就是切片能夠自動擴容,接下來看看切片是如何擴容的
這里可以看到,growslice是返回了一個新的slice,也就是說如果發(fā)生了擴容,會發(fā)生拷貝。
所以我們在使用過程中,如果預先知道容量,可以預先分配好容量再使用,能提高運行效率。
copy這個函數在內部實現為slicecopy
還有關于字符串的拷貝
這里顯示了可以把string拷貝成[]byte,不能把[]byte拷貝成string。
1、切片的數據結構是 array內存地址,len長度,cap容量
2、make的時候需要注意 容量 * 長度 分配的內存大小要小于264,并且要小于可分配的內存量,同時長度不能大于容量。
3、內存增長的過程:
4、當發(fā)生內存擴容時,會發(fā)生拷貝數據的現象,影響程序運行的效率,如果可以,要先分配好指定的容量
5、關于拷貝,可以把string拷貝成[]byte,不能把[]byte拷貝成string。
定義一個切片,然后讓切片去引用一個已經創(chuàng)建好的數組。基本語法如下:
索引1:切片引用的起始元素位
索引2:切片只引用該元素位之前的元素
例程如下:
在該方法中,我們未指定容量cap,這里的值為5是系統定義的。
在方法一中,可以用arr數組名來操控數組中的元素,也可以通過slice切片來操控數組中的元素。切片是直接引用數組,數組是事先存在的,程序員是可見的。
通過 make 來創(chuàng)建切片,基本語法如下:
make函數第三個參數cap即容量是可選的,如果一定要自己注明的話,要注意保證cap≥len。
用該方法可以 指定切片的大小(len)和容量(cap)
例程如下:
由于未賦值系統默認將元素值置為0,即:
數值類型數組:????默認值為 0
字符串數組:? ? ? ?默認值為 ""
bool數組:? ? ? ? ? ?默認值為 false
在方法二中,通過make方式創(chuàng)建的切片對應的數組是由make底層維護,對外不可見,即只能通過slice去訪問各個元素。
定義一個切片,直接就指定具體數組,使用原理類似于make的方式。
例程如下:
Go語言標準庫中提供了sort包對整型,浮點型,字符串型切片進行排序,檢查一個切片是否排好序,使用二分法搜索函數在一個有序切片中搜索一個元素等功能。
關于sort包內的函數說明與使用,請查看
在這里簡單講幾個sort包中常用的函數
在Go語言中,對字符串的排序都是按照字節(jié)排序,也就是說在對字符串排序時是區(qū)分大小寫的。
二分搜索算法
Go語言中提供了一個使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個元素,其中n為切片中元素的總數。
sort.Search(size,fn)函數接受兩個參數:所處理的切片的長度和一個將目標元素與有序切片的元素相比較的函數,該函數是一個閉包,如果該有序切片是升序排列,那么在判斷時使用 有序切片的元素 = 目標元素。該函數返回一個int值,表示與目標元素相同的切片元素的索引。
在切片中查找出某個與目標字符串相同的元素索引
分享題目:go語言的切片,go語言切片擴容
網頁地址:http://chinadenli.net/article28/hcjjcp.html
成都網站建設公司_創(chuàng)新互聯,為您提供企業(yè)網站制作、網站改版、響應式網站、企業(yè)建站、靜態(tài)網站、營銷型網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯