真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言切片容量 go語言切片初始化

go語言切片的長度和容量怎么計算

與其他大多數(shù)語言類似,Go語言的數(shù)組也是一個元素類型相同的定長的序列。

創(chuàng)新互聯(lián)于2013年成立,先為小店等服務(wù)建站,小店等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為小店企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

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

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

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

例程如下:

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

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

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

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

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

例程如下:

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

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

字符串數(shù)組:? ? ? ?默認值為 ""

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

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

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

例程如下:

go語言數(shù)組,切片和字典的區(qū)別和聯(lián)系

、數(shù)組 

與其他大多數(shù)語言類似,Go語言的數(shù)組也是一個元素類型相同的定長的序列。

(1)數(shù)組的創(chuàng)建。

數(shù)組有3種創(chuàng)建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下:

復制代碼代碼如下:

func test5() {

var iarray1 [5]int32

var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5}

iarray3 := [5]int32{1, 2, 3, 4, 5}

iarray4 := [5]int32{6, 7, 8, 9, 10}

iarray5 := [...]int32{11, 12, 13, 14, 15}

iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}}

fmt.Println(iarray1)

fmt.Println(iarray2)

fmt.Println(iarray3)

fmt.Println(iarray4)

fmt.Println(iarray5)

fmt.Println(iarray6)

}

結(jié)果:

[0 0 0 0 0]

[1 2 3 4 5]

[1 2 3 4 5]

[6 7 8 9 10]

[11 12 13 14 15]

[[1 0 0 0] [1 2 0 0] [1 2 3 0] [0 0 0 0]]

我們看數(shù)組 iarray1,只聲明,并未賦值,Go語言幫我們自動賦值為0。再看 iarray2 和 iarray3 ,我們可以看到,Go語言的聲明,可以表明類型,也可以不表明類型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全沒問題的。

(2)數(shù)組的容量和長度是一樣的。cap() 函數(shù)和 len() 函數(shù)均輸出數(shù)組的容量(即長度)。如:

復制代碼代碼如下:

func test6() {

iarray4 := [5]int32{6, 7, 8, 9, 10}

fmt.Println(len(iarray4))

fmt.Println(cap(iarray4))

}

輸出都是5。

(3)使用:

復制代碼代碼如下:

func test7() {

iarray7 := [5]string{"aaa", `bb`, "可以啦", "叫我說什么好", "()"}

fmt.Println(iarray7)

for i := range iarray7 {

fmt.Println(iarray7[i])

}

}

二、切片

Go語言中,切片是長度可變、容量固定的相同的元素序列。Go語言的切片本質(zhì)是一個數(shù)組。容量固定是因為數(shù)組的長度是固定的,切片的容量即隱藏數(shù)組的長度。長度可變指的是在數(shù)組長度的范圍內(nèi)可變。

(1)切片的創(chuàng)建。

切片的創(chuàng)建有4種方式:

1)make ( []Type ,length, capacity )

2) make ( []Type, length)

3) []Type{}

4) []Type{value1 , value2 , ... , valueN }

從3)、4)可見,創(chuàng)建切片跟創(chuàng)建數(shù)組唯一的區(qū)別在于 Type 前的“ [] ”中是否有數(shù)字,為空,則代表切片,否則則代表數(shù)組。因為切片是長度可變的。如下是創(chuàng)建切片的示例:

復制代碼代碼如下:

func test8() {

slice1 := make([]int32, 5, 8)

slice2 := make([]int32, 9)

slice3 := []int32{}

slice4 := []int32{1, 2, 3, 4, 5}

fmt.Println(slice1)

fmt.Println(slice2)

fmt.Println(slice3)

fmt.Println(slice4)

}

輸出為:

[0 0 0 0 0]

[0 0 0 0 0 0 0 0 0]

[]

[1 2 3 4 5]

如上,創(chuàng)造了4個切片,3個空切片,一個有值的切片。

(2)切片與隱藏數(shù)組:

一個切片是一個隱藏數(shù)組的引用,并且對于該切片的切片也引用同一個數(shù)組。如下示例,創(chuàng)建了一個切片slice0,并根據(jù)這個切片創(chuàng)建了2個切片 slice1 和 slice2:

復制代碼代碼如下:

func test9() {

slice0 := []string{"a", "b", "c", "d", "e"}

slice1 := slice0[2 : len(slice0)-1]

slice2 := slice0[:3]

fmt.Println(slice0, slice1, slice2)

slice2[2] = "8"

fmt.Println(slice0, slice1, slice2)

}

輸出為:

[a b c d e] [c d] [a b c]

[a b 8 d e] [8 d] [a b 8]

可見,切片slice0 、 slice1 和 slice2是同一個底層數(shù)組的引用,所以slice2改變了,其他兩個都會變。

(3)遍歷、修改切片:

復制代碼代碼如下:

func test10() {

slice0 := []string{"a", "b", "c", "d", "e"}

fmt.Println("\n~~~~~~元素遍歷~~~~~~")

for _, ele := range slice0 {

fmt.Print(ele, " ")

ele = "7"

}

fmt.Println("\n~~~~~~索引遍歷~~~~~~")

for index := range slice0 {

fmt.Print(slice0[index], " ")

}

fmt.Println("\n~~~~~~元素索引共同使用~~~~~~")

for index, ele := range slice0 {

fmt.Print(ele, slice0[index], " ")

}

fmt.Println("\n~~~~~~修改~~~~~~")

for index := range slice0 {

slice0[index] = "9"

}

fmt.Println(slice0)

}

如上,前三種循環(huán)使用了不同的for range循環(huán),當for后面,range前面有2個元素時,第一個元素代表索引,第二個元素代表元素值,使用 “_” 則表示忽略,因為go語言中,未使用的值會導致編譯錯誤。

只有一個元素時,該元素代表索引。

只有用索引才能修改元素。如在第一個遍歷中,賦值ele為7,結(jié)果沒有作用。因為在元素遍歷中,ele是值傳遞,ele是該切片元素的副本,修改它不會影響原本值,而在第四個遍歷——索引遍歷中,修改的是該切片元素引用的值,所以可以修改。

結(jié)果為:

~~~~~~元素遍歷~~~~~~

a b c d e

~~~~~~索引遍歷~~~~~~

a b c d e

~~~~~~元素索引共同使用~~~~~~

aa bb cc dd ee

~~~~~~修改~~~~~~

[9 9 9 9 9]

(4)、追加、復制切片:

復制代碼代碼如下:

func test11() {

slice := []int32{}

fmt.Printf("slice的長度為:%d,slice為:%v\n", len(slice), slice)

slice = append(slice, 12, 11, 10, 9)

fmt.Printf("追加后,slice的長度為:%d,slice為:%v\n", len(slice), slice)

slicecp := make([]int32, (len(slice)))

fmt.Printf("slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)

copy(slicecp, slice)

fmt.Printf("復制賦值后,slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)

}

追加、復制切片,用的是內(nèi)置函數(shù)append和copy,copy函數(shù)返回的是最后所復制的元素的數(shù)量。

(5)、內(nèi)置函數(shù)append

內(nèi)置函數(shù)append可以向一個切片后追加一個或多個同類型的其他值。如果追加的元素數(shù)量超過了原切片容量,那么最后返回的是一個全新數(shù)組中的全新切片。如果沒有超過,那么最后返回的是原數(shù)組中的全新切片。無論如何,append對原切片無任何影響。如下示例:

復制代碼代碼如下:

func test12() {

slice := []int32{1, 2, 3, 4, 5, 6}

slice2 := slice[:2]

_ = append(slice2, 50, 60, 70, 80, 90)

fmt.Printf("slice為:%v\n", slice)

fmt.Printf("操作的切片:%v\n", slice2)

_ = append(slice2, 50, 60)

fmt.Printf("slice為:%v\n", slice)

fmt.Printf("操作的切片:%v\n", slice2)

}

如上,append方法用了2次,結(jié)果返回的結(jié)果完全不同,原因是第二次append方法追加的元素數(shù)量沒有超過 slice 的容量。而無論怎樣,原切片slice2都無影響。結(jié)果:

slice為:[1 2 3 4 5 6]

操作的切片:[1 2]

slice為:[1 2 50 60 5 6]

操作的切片:[1 2]

go語言循環(huán)隊列的實現(xiàn)

隊列的概念在 順序隊列 中,而使用循環(huán)隊列的目的主要是規(guī)避假溢出造成的空間浪費,在使用循環(huán)隊列處理假溢出時,主要有三種解決方案

本文提供后兩種解決方案。

順序隊和循環(huán)隊列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續(xù)的存儲單元依次存放自隊頭到隊尾的數(shù)據(jù)元素,同時附設(shè)隊頭(front)和隊尾(rear)兩個指針,但我們要明白一點,這個指針并不是指針變量,而是用來表示數(shù)組當中元素下標的位置。

本文使用切片來完成的循環(huán)隊列,由于一開始使用三個參數(shù)的make關(guān)鍵字創(chuàng)建切片,在輸出的結(jié)果中不包含nil值(看起來很舒服),而且在驗證的過程中發(fā)現(xiàn)使用append()函數(shù)時切片內(nèi)置的cap會發(fā)生變化,在消除了種種障礙后得到了一個四不像的循環(huán)隊列,即設(shè)置的指針是順序隊列的指針,但實際上進行的操作是順序隊列的操作。最后是對make()函數(shù)和append()函數(shù)的一些使用體驗和小結(jié),隊列的應用放在鏈隊好了。

官方描述(片段)

即切片是一個抽象層,底層是對數(shù)組的引用。

當我們使用

構(gòu)建出來的切片的每個位置的值都被賦為interface類型的初始值nil,但是nil值也是有大小的。

而使用

來進行初始化時,雖然生成的切片中不包含nil值,但是無法通過設(shè)置的指針變量來完成入隊和出隊的操作,只能使用append()函數(shù)來進行操作

在go語言中,切片是一片連續(xù)的內(nèi)存空間加上長度與容量的標識,比數(shù)組更為常用。使用 append 關(guān)鍵字向切片中追加元素也是常見的切片操作

正是基于此,在使用go語言完成循環(huán)隊列時,首先想到的就是使用make(type, len, cap)關(guān)鍵字方式完成切片初始化,然后使用append()函數(shù)來操作該切片,但這一方式出現(xiàn)了很多問題。在使用append()函數(shù)時,切片的cap可能會發(fā)生變化,用不好就會發(fā)生擴容或收縮。最終造成的結(jié)果是一個四不像的結(jié)果,入隊和出隊操作變得與指針變量無關(guān),失去了作為循環(huán)隊列的意義,用在順序隊列還算合適。

參考博客:

Go語言中的Nil

Golang之nil

Go 語言設(shè)計與實現(xiàn)


網(wǎng)頁題目:go語言切片容量 go語言切片初始化
分享URL:http://weahome.cn/article/hijjis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部