隊列的概念在 順序隊列 中,而使用循環隊列的目的主要是規避假溢出造成的空間浪費,在使用循環隊列處理假溢出時,主要有三種解決方案
專注于為中小企業提供成都做網站、成都網站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業淇縣免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了近1000家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
本文提供后兩種解決方案。
順序隊和循環隊列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續的存儲單元依次存放自隊頭到隊尾的數據元素,同時附設隊頭(front)和隊尾(rear)兩個指針,但我們要明白一點,這個指針并不是指針變量,而是用來表示數組當中元素下標的位置。
本文使用切片來完成的循環隊列,由于一開始使用三個參數的make關鍵字創建切片,在輸出的結果中不包含nil值(看起來很舒服),而且在驗證的過程中發現使用append()函數時切片內置的cap會發生變化,在消除了種種障礙后得到了一個四不像的循環隊列,即設置的指針是順序隊列的指針,但實際上進行的操作是順序隊列的操作。最后是對make()函數和append()函數的一些使用體驗和小結,隊列的應用放在鏈隊好了。
官方描述(片段)
即切片是一個抽象層,底層是對數組的引用。
當我們使用
構建出來的切片的每個位置的值都被賦為interface類型的初始值nil,但是nil值也是有大小的。
而使用
來進行初始化時,雖然生成的切片中不包含nil值,但是無法通過設置的指針變量來完成入隊和出隊的操作,只能使用append()函數來進行操作
在go語言中,切片是一片連續的內存空間加上長度與容量的標識,比數組更為常用。使用 append 關鍵字向切片中追加元素也是常見的切片操作
正是基于此,在使用go語言完成循環隊列時,首先想到的就是使用make(type, len, cap)關鍵字方式完成切片初始化,然后使用append()函數來操作該切片,但這一方式出現了很多問題。在使用append()函數時,切片的cap可能會發生變化,用不好就會發生擴容或收縮。最終造成的結果是一個四不像的結果,入隊和出隊操作變得與指針變量無關,失去了作為循環隊列的意義,用在順序隊列還算合適。
參考博客:
Go語言中的Nil
Golang之nil
Go 語言設計與實現
數組是一個由 固定長度 的 特定類型元素 組成的序列,一個數組可以由零個或多個元素組成。 數組是值類型
數組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從0開始到數組長度減1的位置,內置函數 len() 可以返回數組中元素的個數。
2.類型的打印,結果的第二種打印方式
3.對元素的修改或者賦值
4.判斷數組是否相等:長度、類型
4.數組的地址:連續存儲的空間
5.數組的賦值、地址、取值
6.數組的默認值
7.數組的初始化
8.數組的逆置
9.求數組的最大值、最小值、平均值
10.對數組字符串進行連接
11.冒泡排序法的實現
12.數組做函數的參數
13.二維數組:賦值和地址
14.二維數組:打印和輸出
15. 指針數組,每一個元素都是地址
17.數組的內存分配
//沒問題的,可以make,應該是你的主線程執行完直接退出了,導致協程沒機會執行,所以
//你看不到輸出而已。
func?main()?{
pix?:=?make([]uint8,?26707968)
fmt.Println("main?len:",len(pix))
go?func()?{
pix?:=?make([]uint8,?3300500)
fmt.Println("go?len:",len(pix))
}()
time.Sleep(time.Second)
}
append的第二個參數是可變長參數,你這樣寫1,2 就會追加2個元素這符合預期效果
在Golang語言開發過程中,我們經常會用到數組和切片數據結構,數組是固定長度的,而切片是可以擴張的數組,那么切片底層到底有什么不同?接下來我們來詳細分析一下內部實現。
首先我們來看一下數據結構
這里的array其實是指向切片管理的內存塊首地址,而len就是切片的實際使用大小,cap就是切片的容量。
我們可以通過下面的代碼輸出slice:
這么分析下來,我們可以了解如下內容:
使用一個切片通常有兩種方法:
另一種是slice = make([]int, len, cap)這種方法,稱為分配內存。
創建一個slice,實質上是在分配內存。
這里跟一下細節,math.MulUintptr是基于底層的指針計算乘法的,這樣計算不會導致超出int大小,這個方法在后面會經常用到。
同樣,對于int64的長度,也有對應的方法
而實際分配內存的操作調用mallocgc這個分配內存的函數,這個函數以后再分析。
我們了解切片和數組最大的不同就是切片能夠自動擴容,接下來看看切片是如何擴容的
這里可以看到,growslice是返回了一個新的slice,也就是說如果發生了擴容,會發生拷貝。
所以我們在使用過程中,如果預先知道容量,可以預先分配好容量再使用,能提高運行效率。
copy這個函數在內部實現為slicecopy
還有關于字符串的拷貝
這里顯示了可以把string拷貝成[]byte,不能把[]byte拷貝成string。
1、切片的數據結構是 array內存地址,len長度,cap容量
2、make的時候需要注意 容量 * 長度 分配的內存大小要小于264,并且要小于可分配的內存量,同時長度不能大于容量。
3、內存增長的過程:
4、當發生內存擴容時,會發生拷貝數據的現象,影響程序運行的效率,如果可以,要先分配好指定的容量
5、關于拷貝,可以把string拷貝成[]byte,不能把[]byte拷貝成string。
定義一個切片,然后讓切片去引用一個已經創建好的數組。基本語法如下:
索引1:切片引用的起始元素位
索引2:切片只引用該元素位之前的元素
例程如下:
在該方法中,我們未指定容量cap,這里的值為5是系統定義的。
在方法一中,可以用arr數組名來操控數組中的元素,也可以通過slice切片來操控數組中的元素。切片是直接引用數組,數組是事先存在的,程序員是可見的。
通過 make 來創建切片,基本語法如下:
make函數第三個參數cap即容量是可選的,如果一定要自己注明的話,要注意保證cap≥len。
用該方法可以 指定切片的大小(len)和容量(cap)
例程如下:
由于未賦值系統默認將元素值置為0,即:
數值類型數組:????默認值為 0
字符串數組:? ? ? ?默認值為 ""
bool數組:? ? ? ? ? ?默認值為 false
在方法二中,通過make方式創建的切片對應的數組是由make底層維護,對外不可見,即只能通過slice去訪問各個元素。
定義一個切片,直接就指定具體數組,使用原理類似于make的方式。
例程如下:
當前名稱:go語言len go語言len函數
本文URL:http://m.kartarina.com/article0/hgspio.html
成都網站建設公司_創新互聯,為您提供電子商務、、網站維護、做網站、關鍵詞優化、網站營銷
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯