99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

go語言聲明固定大小切片 go 切片添加切片

Go語言 排序與搜索切片

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

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供賓陽網(wǎng)站建設(shè)、賓陽做網(wǎng)站、賓陽網(wǎng)站設(shè)計、賓陽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、賓陽企業(yè)網(wǎng)站模板建站服務(wù),十年賓陽做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

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

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

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

二分搜索算法

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

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

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

go語言中數(shù)組使用的注意事項和細(xì)節(jié)

1、數(shù)組是多個 相同類型 的數(shù)據(jù)的組合,一個數(shù)組一旦聲明/定義了,其 長度是固定的,不能動態(tài)變化 。

2、var arr []int? ? 這時arr就是一個slice 切片 。

3、數(shù)組中的元素可以是任何數(shù)據(jù)類型,包括值類型和引用類型,但是 不能混用 。

4、數(shù)組創(chuàng)建后,如果沒有賦值,有默認(rèn)值如下:

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

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

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

5、使用數(shù)組的步驟:

? ? (1)聲明數(shù)組并開辟空間

? ? (3)給數(shù)組各個元素賦值

? ? (3)使用數(shù)組

6、數(shù)組的下標(biāo)是從0開始的。

7、數(shù)組下標(biāo)必須在指定范圍內(nèi)使用,否則報panic:數(shù)組越界,比如var arr [5]int的有效下標(biāo)為0~4.

8、Go的數(shù)組屬于 值類型 ,在默認(rèn)情況下是 值傳遞 ,因此會進(jìn)行值拷貝。 數(shù)組間不會相互影響。

9、如想在其他函數(shù)中去修改原來的數(shù)組,可以使用 引用傳遞 (指針方式)。

10、長度是數(shù)組類型的一部分,在傳遞函數(shù)參數(shù)時,需要考慮數(shù)組的長度,看以下案例:

題1:編譯錯誤,因為不能把[3]int類型傳遞給[]int類型,前者是數(shù)組,后者是切片;

題2:編譯錯誤,因為不能把[3]int類型傳遞給[4]int類型;

題3:編譯正確,因為[3]int類型傳給[3]int類型合法。

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

定義一個切片,然后讓切片去引用一個已經(jīng)創(chuàng)建好的數(shù)組。基本語法如下:

索引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)默認(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去訪問各個元素。

定義一個切片,直接就指定具體數(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} 如下:

復(fù)制代碼代碼如下:

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ù)組的容量(即長度)。如:

復(fù)制代碼代碼如下:

func test6() {

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

fmt.Println(len(iarray4))

fmt.Println(cap(iarray4))

}

輸出都是5。

(3)使用:

復(fù)制代碼代碼如下:

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)建切片的示例:

復(fù)制代碼代碼如下:

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:

復(fù)制代碼代碼如下:

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)遍歷、修改切片:

復(fù)制代碼代碼如下:

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),當(dāng)for后面,range前面有2個元素時,第一個元素代表索引,第二個元素代表元素值,使用 “_” 則表示忽略,因為go語言中,未使用的值會導(dǎo)致編譯錯誤。

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

只有用索引才能修改元素。如在第一個遍歷中,賦值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)、追加、復(fù)制切片:

復(fù)制代碼代碼如下:

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("復(fù)制賦值后,slicecp的長度為:%d,slicecp為:%v\n", len(slicecp), slicecp)

}

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

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

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

復(fù)制代碼代碼如下:

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]

GoLang中的切片擴(kuò)容機(jī)制

[5]int 是數(shù)組,而 []int 是切片。二者看起來相似,實則是根本上不同的數(shù)據(jù)結(jié)構(gòu)。

切片的數(shù)據(jù)結(jié)構(gòu)中,包含一個指向數(shù)組的指針 array ,當(dāng)前長度 len ,以及最大容量 cap 。在使用 make([]int, len) 創(chuàng)建切片時,實際上還有第三個可選參數(shù) cap ,也即 make([]int, len, cap) 。在不聲明 cap 的情況下,默認(rèn) cap=len 。當(dāng)切片長度沒有超過容量時,對切片新增數(shù)據(jù),不會改變 array 指針的值。

當(dāng)對切片進(jìn)行 append 操作,導(dǎo)致長度超出容量時,就會創(chuàng)建新的數(shù)組,這會導(dǎo)致和原有切片的分離。在下例中

由于 a 的長度超出了容量,所以切片 a 指向了一個增長后的新數(shù)組,而 b 仍然指向原來的老數(shù)組。所以之后對 a 進(jìn)行的操作,對 b 不會產(chǎn)生影響。

試比較

本例中, a 的容量為6,因此在 append 后并未超出容量,所以 array 指針沒有改變。因此,對 a 進(jìn)行的操作,對 b 同樣產(chǎn)生了影響。

下面看看用 a := []int{} 這種方式來創(chuàng)建切片會是什么情況。

可以看到,空切片的容量為0,但后面向切片中添加元素時,并不是每次切片的容量都發(fā)生了變化。這是因為,如果增大容量,也即需要創(chuàng)建新數(shù)組,這時還需要將原數(shù)組中的所有元素復(fù)制到新數(shù)組中,開銷很大,所以GoLang設(shè)計了一套擴(kuò)容機(jī)制,以減少需要創(chuàng)建新數(shù)組的次數(shù)。但這導(dǎo)致無法很直接地判斷 append 時是否創(chuàng)建了新數(shù)組。

如果一次添加多個元素,容量又會怎樣變化呢?試比較下面兩個例子:

那么,是不是說,當(dāng)向一個空切片中插入 2n-1 個元素時,容量就會被設(shè)置為 2n 呢?我們來試試其他的數(shù)據(jù)類型。

可以看到,根據(jù)切片對應(yīng)數(shù)據(jù)類型的不同,容量增長的方式也有很大的區(qū)別。相關(guān)的源碼包括: src/runtime/msize.go , src/runtime/mksizeclasses.go 等。

我們再看看切片初始非空的情形。

可以看到,與剛剛向空切片添加5個int的情況一致,向有3個int的切片中添加2個int,容量增長為6。

需要注意的是, append 對切片擴(kuò)容時,如果容量超過了一定范圍,處理策略又會有所不同。可以看看下面這個例子。

具體為什么會是這樣的變化過程,還需要從 源碼 中尋找答案。下面是 src/runtime/slice.go 中的 growslice 函數(shù)中的核心部分。

GoLang中的切片擴(kuò)容機(jī)制,與切片的數(shù)據(jù)類型、原本切片的容量、所需要的容量都有關(guān)系,比較復(fù)雜。對于常見數(shù)據(jù)類型,在元素數(shù)量較少時,大致可以認(rèn)為擴(kuò)容是按照翻倍進(jìn)行的。但具體情況需要具體分析。

新聞名稱:go語言聲明固定大小切片 go 切片添加切片
分享路徑:http://www.yijiale78.com/article16/dooehdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作面包屑導(dǎo)航網(wǎng)站收錄網(wǎng)頁設(shè)計公司網(wǎng)站排名微信公眾號

廣告

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

成都定制網(wǎng)站建設(shè)