go語言切片推薦 go語言切片擴容

Go切片數組深度解析

Go 中的分片數組,實際上有點類似于Java中的ArrayList,是一個可以擴展的數組,但是Go中的切片由比較靈活,它和數組很像,也是基于數組,所以在了解Go切片前我們先了解下數組。

成都創新互聯是專業的吉安網站建設公司,吉安接單;提供網站設計、網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行吉安網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!

數組簡單描述就由相同類型元素組成的數據結構, 在創建初期就確定了長度,是不可變的。

但是Go的數組類型又和C與Java的數組類型不一樣, NewArray 用于創建一個數組,從源碼中可以看出最后返回的是 Array{}的指針,并不是第一個元素的指針,在Go中數組屬于值類型,在進行傳遞時,采取的是值傳遞,通過拷貝整個數組。Go語言的數組是一種有序的struct。

Go 語言的數組有兩種不同的創建方式,一種是顯示的初始化,一種是隱式的初始化。

注意一定是使用 [...]T 進行創建,使用三個點的隱式創建,編譯器會對數組的大小進行推導,只是Go提供的一種語法糖。

其次,Go中數組的類型,是由數值類型和長度兩個一起確定的。[2]int 和 [3]int 不是同一個類型,不能進行傳參和比較,把數組理解為類型和長度兩個屬性的結構體,其實就一目了然了。

Go中的數組屬于值類型,通常應該存儲于棧中,局部變量依然會根據逃逸分析確定存儲棧還是堆中。

編譯器對數組函數中做兩種不同的優化:

在靜態區完成賦值后復制到棧中。

總結起來,在不考慮逃逸分析的情況下,如果數組中元素的個數小于或者等于 4 個,那么所有的變量會直接在棧上初始化,如果數組元素大于 4 個,變量就會在靜態存儲區初始化然后拷貝到棧上。

由于數組是值類型,那么賦值和函數傳參操作都會復制整個數組數據。

不管是賦值或函數傳參,地址都不一致,發生了拷貝。如果數組的數據較大,則會消耗掉大量內存。那么為了減少拷貝我們可以主動的傳遞指針呀。

地址是一樣的,不過傳指針會有一個弊端,從打印結果可以看到,指針地址都是同一個,萬一原數組的指針指向更改了,那么函數里面的指針指向都會跟著更改。

同樣的我們將數組轉換為切片,通過傳遞切片,地址是不一樣的,數組值相同。

切片是引用傳遞,所以它們不需要使用額外的內存并且比使用數組更有效率。

所以,切片屬于引用類型。

通過這種方式可以將數組轉換為切片。

中間不加三個點就是切片,使用這種方式創建切片,實際上是先創建數組,然后再通過第一種方式創建。

使用make創建切片,就不光編譯期了,make創建切片會涉及到運行期。1. 切片的大小和容量是否足夠??;

切片是否發生了逃逸,最終在堆上初始化。如果切片小的話會先在?;蜢o態區進行創建。

切片有一個數組的指針,len是指切片的長度, cap指的是切片的容量。

cap是在初始化切片是生成的容量。

發現切片的結構體是數組的地址指針array unsafe.Pointer,而Go中數組的地址代表數組結構體的地址。

slice 中得到一塊內存地址,array[0]或者unsafe.Pointer(array[0])。

也可以通過地址構造切片

nil切片:指的unsafe.Pointer 為nil

空切片:

創建的指針不為空,len和cap為空

當一個切片的容量滿了,就需要擴容了。怎么擴,策略是什么?

如果原來數組切片的容量已經達到了最大值,再想擴容, Go 默認會先開一片內存區域,把原來的值拷貝過來,然后再執行 append() 操作。這種情況對現數組的地址和原數組地址不相同。

從上面結果我們可以看到,如果用 range 的方式去遍歷一個切片,拿到的 Value 其實是切片里面的值拷貝,即淺拷貝。所以每次打印 Value 的地址都不變。

由于 Value 是值拷貝的,并非引用傳遞,所以直接改 Value 是達不到更改原切片值的目的的,需要通過 slice[index] 獲取真實的地址。

go語言中實現切片(slice)的三種方式

定義一個切片,然后讓切片去引用一個已經創建好的數組。基本語法如下:

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

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

例程如下:

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

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

通過 make 來創建切片,基本語法如下:

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

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

例程如下:

由于未賦值系統默認將元素值置為0,即:

數值類型數組:????默認值為 0

字符串數組:? ? ? ?默認值為 ""

bool數組:? ? ? ? ? ?默認值為 false

在方法二中,通過make方式創建的切片對應的數組是由make底層維護,對外不可見,即只能通過slice去訪問各個元素。

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

例程如下:

Go語言 排序與搜索切片

Go語言標準庫中提供了sort包對整型,浮點型,字符串型切片進行排序,檢查一個切片是否排好序,使用二分法搜索函數在一個有序切片中搜索一個元素等功能。

關于sort包內的函數說明與使用,請查看

在這里簡單講幾個sort包中常用的函數

在Go語言中,對字符串的排序都是按照字節排序,也就是說在對字符串排序時是區分大小寫的。

二分搜索算法

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

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

在切片中查找出某個與目標字符串相同的元素索引

當前文章:go語言切片推薦 go語言切片擴容
分享URL:http://m.kartarina.com/article26/dogiecg.html

成都網站建設公司_創新互聯,為您提供軟件開發、網站維護、服務器托管、自適應網站、動態網站企業建站

廣告

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

成都網頁設計公司
主站蜘蛛池模板: 精品久久久久久久无码久中文字幕 | 国产成年无码v片在线| 久久久久无码精品国产h动漫| 无码H黄肉动漫在线观看网站| 曰韩无码无遮挡A级毛片| 国产成人精品无码免费看 | 日韩亚洲AV无码一区二区不卡| 在线看片无码永久免费aⅴ| 亚洲精品无码午夜福利中文字幕| 亚洲AV无码AV男人的天堂不卡| 中文字幕丰满乱子无码视频| 日本精品无码一区二区三区久久久 | 99久久亚洲精品无码毛片| 中文字幕人妻三级中文无码视频| 久久ZYZ资源站无码中文动漫| 亚洲AV无码之日韩精品| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲AV无码乱码国产麻豆| 国产午夜无码片在线观看影院| 日韩乱码人妻无码中文字幕| 中文字幕无码无码专区| 国产综合无码一区二区色蜜蜜| 无码亚洲成a人在线观看| 久久精品中文字幕无码绿巨人| 无码人妻黑人中文字幕| 亚洲人成无码网WWW| HEYZO无码综合国产精品| 成年轻人电影www无码| av色欲无码人妻中文字幕| 欧洲黑大粗无码免费| 无码精品国产va在线观看dvd| 高清无码中文字幕在线观看视频| 亚洲AV无码久久精品蜜桃| 亚洲国产精品无码专区| 性无码免费一区二区三区在线 | 最新中文字幕av无码专区| 亚洲AV无码成人精品区日韩| 无码人妻丰满熟妇区五十路| 国产精品午夜无码体验区| 久青草无码视频在线观看| 国产精品无码免费专区午夜|