av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

一篇帶給你Go 語(yǔ)言的數(shù)組與切片

數(shù)組

數(shù)組是一組類(lèi)型相同的,長(zhǎng)度固定的,按數(shù)字編號(hào)排列的數(shù)據(jù)序列。由于 go 語(yǔ)言中,數(shù)組的類(lèi)型相同且長(zhǎng)度固定,所以在聲明數(shù)組的時(shí)候,就會(huì)體現(xiàn)這兩個(gè)特點(diǎn)。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),霞浦企業(yè)網(wǎng)站建設(shè),霞浦品牌網(wǎng)站建設(shè),網(wǎng)站定制,霞浦網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,霞浦網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

 
 
 
 
  1. var array [5]int // [0 0 0 0 0] 

數(shù)組通過(guò) [SIZE](方括號(hào)內(nèi)為數(shù)組長(zhǎng)度) 加上 TYPE(類(lèi)型) 的形式聲明,上面的代碼就表示 array 變量為一個(gè)長(zhǎng)度為 5,且五個(gè)數(shù)據(jù)的類(lèi)型都為 int。

在之前介紹變量的時(shí)候,介紹過(guò) int 類(lèi)型的默認(rèn)值為 0,所以 array 的值為 [0 0 0 0 0]。

數(shù)組初始化

數(shù)組在初始化階段,需要通過(guò) {} 的方式,指定數(shù)組每個(gè)位置的具體值。

 
 
 
 
  1. var array [3]int = [3]int{1, 2, 3} // [1 2 3] 

可以看到 {} 的前面也要帶上數(shù)組的長(zhǎng)度與類(lèi)型,由于 go 能夠進(jìn)行類(lèi)型推導(dǎo),變量后聲明的類(lèi)型顯得有點(diǎn)多余,是可以省略的。

 
 
 
 
  1. var array = [3]int{1, 2, 3} // [1 2 3] 

指定索引賦值

初始化的過(guò)程中,我們還可以指定索引進(jìn)行賦值,也就是不必給數(shù)組的每個(gè)位置都安排上具體的值。

 
 
 
 
  1. var array = [5]int{1: 77, 3: 77} // [0 77 0 77 0] 

上面的數(shù)組輸出的結(jié)果為:[0 77 0 77 0]。和其他語(yǔ)言一樣,數(shù)組的索引是從 0 開(kāi)始的,我們給索引為 1 和 3 位置都指定了值為 77 ,其他位置由于沒(méi)有指定具體值,就是其類(lèi)型的默認(rèn)值。

自動(dòng)推導(dǎo)數(shù)組長(zhǎng)度

前面的案例都是指定了數(shù)組的長(zhǎng)度,其實(shí)我們可以通過(guò) [...] 的方式,告訴 go 編譯器,數(shù)組長(zhǎng)度尚未確定,在初始化之后才能確定其長(zhǎng)度,然后 go 在編譯階段就會(huì)自動(dòng)進(jìn)行推導(dǎo)。

 
 
 
 
  1. var array = [...]int{1, 2, 3, 4, 5} // [1 2 3 4 5] 
  2. fmt.Println("array length is", len(array)) 

我們可以通過(guò) len 方法獲取數(shù)組的長(zhǎng)度,上面代碼的運(yùn)行結(jié)果如下:

如果我們?cè)谥付ㄋ饕奈恢觅x值了,最終長(zhǎng)度取決于最末尾的索引,下面的代碼中,指定了索引 5 的值為 77,則數(shù)組的長(zhǎng)度為 6。

 
 
 
 
  1. var array = [...]int{1: 77, 5: 77} // [0 77 0 0 0 77] 
  2. fmt.Println("array length is", len(array)) 

賦值與訪問(wèn)

與其他語(yǔ)言一樣,數(shù)組的賦值和訪問(wèn)都是通過(guò) [Index] 操作的。

 
 
 
 
  1. var array = [...]int{1, 2, 3} 
  2. array[0] = 100 // 索引 0 的位置重新賦值為 100 
  3. fmt.Println("array is", array) 

取值也是同樣的操作,我們現(xiàn)在實(shí)現(xiàn)一個(gè)求數(shù)組平均數(shù)的函數(shù):

 
 
 
 
  1. func getAverage(array [5]int) float32 { 
  2.  var sum int 
  3.  var avg float32 
  4.  
  5.  for i := 0; i < 5; i++ { 
  6.   sum += array[i] 
  7.  } 
  8.  
  9.  avg = float32(sum) / 5 
  10.  
  11.  return avg 
 
 
 
 
  1. var array = [5]int{1, 2, 3, 4, 5} 
  2. fmt.Println("average is", getAverage(array)) 

多維數(shù)組

多維數(shù)組的聲明,相對(duì)于一維數(shù)組,就是看前面有幾個(gè) [SIZE]。

 
 
 
 
  1. var a1 [2][3]int // 二維數(shù)組 
  2. var a1 [2][3][4]int // 三維數(shù)組 

我們拿三維數(shù)組舉例,第一個(gè) [] 內(nèi)的數(shù)字表示最外層數(shù)組的長(zhǎng)度,往后以此類(lèi)推。[2][3][4]int 表示最外層數(shù)組長(zhǎng)度為 2,第二層數(shù)組長(zhǎng)度為 3,最內(nèi)層數(shù)組長(zhǎng)度為 4。其賦值方式也和一維數(shù)組一樣,只是多維數(shù)組需要將多個(gè) {} 進(jìn)行嵌套。

 
 
 
 
  1. var a1 = [2][3][4]int{ 
  2.   { 
  3.     {1, 2, 3, 4}, 
  4.     {1, 2, 3, 4}, 
  5.     {1, 2, 3, 4}, 
  6.   }, 
  7.   { 
  8.     {1, 2, 3, 4}, 
  9.     {1, 2, 3, 4}, 
  10.     {1, 2, 3, 4}, 
  11.   }, 
  12. fmt.Println(a1) 

打印結(jié)果:

多維數(shù)組的訪問(wèn)和一維數(shù)組一樣,也是通過(guò) [] + 數(shù)組索引,只是多維數(shù)組要訪問(wèn)某個(gè)值需要多個(gè) []。

如果我們要拿到下圖的 2,訪問(wèn)方式為:array[0][1][1]

 
 
 
 
  1. fmt.Println("array[0][1][1] = ", array[0][1][1]) 

切片

前面介紹過(guò),數(shù)組是一組類(lèi)型相同且長(zhǎng)度固定的數(shù)據(jù)集合,而切片就是一種比較抽象的數(shù)組,其長(zhǎng)度不固定,聲明方式與數(shù)組類(lèi)似([] 中不顯示注明數(shù)組長(zhǎng)度,也不使用 [...] 的方式進(jìn)行長(zhǎng)度的推導(dǎo)):

 
 
 
 
  1. var slice []int 

切片初始化

切片的初始化與數(shù)組類(lèi)似,只要省略掉 [] 內(nèi)注明的數(shù)組長(zhǎng)度即可:

 
 
 
 
  1. var s1 = []int{1, 2, 3} 
  2. s2 := []int{1, 2, 3} // 簡(jiǎn)寫(xiě) 

除了這種字面量的聲明方式,還可以通過(guò) go 的內(nèi)置方法:make,來(lái)進(jìn)行切片的初始化:

 
 
 
 
  1. var s1 = make([]int, 3) 
  2. s2 := make([]int, 3) // 簡(jiǎn)寫(xiě) 

make 方法的第二個(gè)參數(shù)表示切片的長(zhǎng)度,雖然切片的長(zhǎng)度可變,但是通過(guò) make 方法創(chuàng)建切片時(shí),需要指定一個(gè)長(zhǎng)度。除了指定切片的長(zhǎng)度,make 方法還支持傳入第三個(gè)參數(shù),用來(lái)指定切片的『容量』,如果沒(méi)有指定切片的容量,那初始狀態(tài)切片的容量與長(zhǎng)度一致。

 
 
 
 
  1. func make([]T, len, cap) 

長(zhǎng)度與容量

長(zhǎng)度指的是,切片內(nèi)有多少個(gè)元素,而容量可以理解為,當(dāng)前切片在內(nèi)存中開(kāi)辟了多大的空間。前面介紹過(guò),可以通過(guò) len 方法獲取到數(shù)組的長(zhǎng)度,獲取切片的長(zhǎng)度也可以使用該方法。要獲取切片的容量,可以使用 cap 方法。

 
 
 
 
  1. s1 := make([]int, 5) 
  2. fmt.Printf("The length of s1 is %d\n", len(s1)) 
  3. fmt.Printf("The capacity of s1 is %d\n", cap(s1)) 

可以看到初始狀態(tài)下,切片的長(zhǎng)度與容量一致。如果要修改切片的長(zhǎng)度,可以通過(guò) append方法,在切片尾部追加一個(gè)新的值。

 
 
 
 
  1. s1 := make([]int, 3, 5) // 聲明一個(gè)長(zhǎng)度為 3,容量為 5 的切面 
  2. s1 = append(s1, 1) // 在尾部追加一個(gè)值,長(zhǎng)度會(huì)變成 4 
  3.  
  4. fmt.Printf("The length of s1 is %d\n", len(s1)) 
  5. fmt.Printf("The capacity of s1 is %d\n", cap(s1)) 

append 方法是可以接受多個(gè)參數(shù),我們?cè)谧芳右粋€(gè)值之后,繼續(xù)調(diào)用 append 方法,往切片后再追加兩個(gè)值:

 
 
 
 
  1. s1 := make([]int, 3, 5) 
  2. s1 = append(s1, 1) 
  3. s1 = append(s1, 2, 3) 
  4. fmt.Println(s1) // [0 0 0 1 2 3] 
  5. fmt.Printf("The length of s1 is %d\n", len(s1)) 
  6. fmt.Printf("The capacity of s1 is %d\n", cap(s1)) 

此時(shí)的切片的長(zhǎng)度已經(jīng)變成了 6,超過(guò)了切片的容量,那這個(gè)時(shí)候切換的容量會(huì)不會(huì)也變成 6?

根據(jù)輸出的結(jié)果,此時(shí)切片的容量變成了 10,這意味著切片的容量的擴(kuò)充是在之前的基礎(chǔ)上進(jìn)行翻倍操作的。為了驗(yàn)證這個(gè)結(jié)論,我們?cè)谇衅罄^續(xù)追加 5 個(gè)值,讓切片的長(zhǎng)度變成 11,超出當(dāng)前的容量,看看容量會(huì)變成多少。

 
 
 
 
  1. s1 := make([]int, 3, 5) 
  2. s1 = append(s1, 1) 
  3. s1 = append(s1, 2, 3) 
  4. s1 = append(s1, 4, 5, 6, 7, 8) 
  5.  
  6. fmt.Printf("The length of s1 is %d\n", len(s1)) 
  7. fmt.Printf("The capacity of s1 is %d\n", cap(s1)) 

可以看到切片的容量變成了 20,這也驗(yàn)證了我們之前的結(jié)論,當(dāng)切片長(zhǎng)度超過(guò)了其容量,容量會(huì)在原來(lái)的基礎(chǔ)上翻倍。那如果切片容量達(dá)到了 2000,長(zhǎng)度超過(guò) 2000,容量也會(huì)變成 4000 嗎?

 
 
 
 
  1. s1 := make([]int, 1024) 
  2. s1 = append(s1, 1) 
  3.  
  4. fmt.Printf("\nThe length of s1 is %d\n", len(s1)) 
  5. fmt.Printf("The capacity of s1 is %d\n", cap(s1)) 

可以看到,我們新定義的切片長(zhǎng)度為 1024,在長(zhǎng)度變成 1025 的時(shí)候,容量并沒(méi)有翻倍。為了避免切片容量無(wú)休止的擴(kuò)展,go 規(guī)定如果當(dāng)前切片的長(zhǎng)度大于 1024 ,在長(zhǎng)度超過(guò)其容量時(shí),只會(huì)增加 25% 的容量。

切片截取

切片之所以叫切片,是因?yàn)樗梢酝ㄟ^(guò)切出數(shù)組中的某一塊來(lái)創(chuàng)建。語(yǔ)法規(guī)則也很簡(jiǎn)單:Array[start:end]。

 
 
 
 
  1. arr := [5]int{1, 2, 3, 4, 5} 
  2. slice := arr[1:3] 
  3.  
  4. fmt.Println(slice) // [2 3] 

arr[1:3] 表示將數(shù)組的從索引為 1 的位置一直到索引為 3 的位置(不包括 3)截取出來(lái),形成一個(gè)切片。當(dāng)然這個(gè)開(kāi)頭結(jié)尾的數(shù)字也是可以省略的,如果我們?nèi)绻覀兪÷蚤_(kāi)頭就表示截取開(kāi)始的位置為 0,省略結(jié)尾就表示截取結(jié)束的位置一直到數(shù)組的最后一位。

 
 
 
 
  1. arr := [5]int{1, 2, 3, 4, 5} 
  2. slice := arr[1:] 
  3. fmt.Println(slice) // [2 3 4 5] 

通過(guò)省略截取的開(kāi)頭和結(jié)尾,我們就能將一個(gè)數(shù)組進(jìn)行一次拷貝操作,然后形成一個(gè)切片。(PS. 截取操作形成的新數(shù)據(jù)是一個(gè)切片)

 
 
 
 
  1. arr := [5]int{1, 2, 3, 4, 5} 
  2. slice := arr[:] 
  3.  
  4. fmt.Printf("slice = %v, slice type is %T", slice, slice) 

文章名稱(chēng):一篇帶給你Go 語(yǔ)言的數(shù)組與切片
文章轉(zhuǎn)載:http://uogjgqi.cn/article/cdgppsi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流