輕松讀懂Golang中的數(shù)組和切片
一、數(shù)組和切片的區(qū)別是什么?
1.數(shù)組
數(shù)組是內(nèi)置(build-in)類型,是一組同類型數(shù)據(jù)的集合,它是值類型,通過(guò)從0開(kāi)始的下標(biāo)索引訪問(wèn)元素值。在初始化后長(zhǎng)度是固定的,無(wú)法修改其長(zhǎng)度。當(dāng)作為方法的參數(shù)傳入時(shí)將復(fù)制一份數(shù)組而不是引用同一指針。數(shù)組的長(zhǎng)度也是其類型的一部分,通過(guò)內(nèi)置函數(shù)len(array)獲取其長(zhǎng)度。
2.切片
Slices切片(“動(dòng)態(tài)數(shù)組")也是內(nèi)置類型,但與數(shù)組相比切片的長(zhǎng)度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。切片是引用類型,因此在當(dāng)傳遞切片時(shí)將引用同一指針,修改值將會(huì)影響其他的對(duì)象。
切片中有兩個(gè)概念:
- len長(zhǎng)度,長(zhǎng)度是指已經(jīng)被賦過(guò)值的最大下標(biāo)+1,可通過(guò)內(nèi)置函數(shù)len()獲得。
- cap容量,容量是指切片目前可容納的最多元素個(gè)數(shù),可通過(guò)內(nèi)置函數(shù)cap()獲得。
二、數(shù)組和切片的初始化?
1.數(shù)組
package main import "fmt" func main() { //初始化數(shù)組的初始化有多種形式,查看示例代碼 a0 := [5]int{1, 2, 3, 4, 5} //長(zhǎng)度為5的數(shù)組,其元素值依次為:1,2,3,4,5 // [1 2 3 4 5] a1 := [5]int{1, 2} //長(zhǎng)度為5的數(shù)組,其元素值依次為:1,2,0,0,0 。 //未指定初值的元素將會(huì)賦初值 //int的默認(rèn)值0,string的默認(rèn)值是"" //[1 2 0 0 0] a2 := [...]int{1, 2, 3, 4, 5} //長(zhǎng)度為5的數(shù)組,其長(zhǎng)度是根據(jù)初始化時(shí)指定的元素個(gè)數(shù)決定的 // [...] 長(zhǎng)度不固定,根據(jù)元素個(gè)數(shù)改變 // [1 2 3 4 5] a3 := [5]int{2: 1, 3: 2, 4: 3} //長(zhǎng)度為5的數(shù)組,key:value, //key:value 2 : 1 即 a3[2] = 1 // 3 : 2 即 a3[3] = 2 // [0 0 1 2 3] a4 := [...]int{2: 1, 4: 3} //長(zhǎng)度為5的數(shù)組,起元素值依次為:0,0,1,0,3。由于指定了最大索引4對(duì)應(yīng)的值3,根據(jù)初始化的元素個(gè)數(shù)確定其長(zhǎng)度為5賦值與使用 // [...] 長(zhǎng)度不固定,根據(jù)元素個(gè)數(shù)改變 // key:value 4 : 3 即 a4[4] = 3 // 所以需要有 5 個(gè)元素,即長(zhǎng)度 [5]int // [0 0 1 0 3] fmt.Println(a0, a1, a2, a3, a4) }
2.切片
package main import "fmt" func main() { s0 :=[]int {1,2,3 } //[1 2 3] //直接初始化切片,[]表示是切片類型,{1,2,3}初始化值依次是1,2,3 fmt.Println(cap(s0),len(s0)) //cap=len=3 s1 := s0[:] //[1 2 3] //初始化切片s,是數(shù)組arr的引用 fmt.Println(cap(s1),len(s1)) //cap=len=3 s2 := s0[1:2] //[2] //將arr中從下標(biāo)startIndex到endIndex-1 下的元素創(chuàng)建為一個(gè)新的切片 fmt.Println(cap(s2),len(s2)) //cap=2 len=1 s3 := s0[1:] //[2 3] //缺省endIndex時(shí)將表示一直到arr的最后一個(gè)元素 fmt.Println(cap(s3),len(s3)) //cap=len=2 s4 := s0[:2] //[1 2] //缺省startIndex時(shí)將表示從arr的第一個(gè)元素開(kāi)始 fmt.Println(cap(s4),len(s4)) //cap=3 len=2 s5 := s4[:] //[1 2] //通過(guò)切片s初始化切片s1 fmt.Println(cap(s5),len(s5)) //cap=3 len=2 s6 :=make([]int,1,2) //[0] //通過(guò)內(nèi)置函數(shù)make()初始化切片s,[]int 標(biāo)識(shí)為其元素類型為int的切片 fmt.Println(cap(s6),len(s6)) //cap=2 len=1 fmt.Println(s0,s1,s2,s3,s4,s5,s6) }
二、常見(jiàn)問(wèn)題
1.切片的初始化與追加
代碼如下(示例):
package main import "fmt" func main() { // 由初始化已知,此時(shí)len(s) = 10 cap(s) = 10 // make 那么此時(shí) int 已有初值 0 s := make([]int, 10) // 在末尾插入三個(gè)元素 1,2,3 s = append(s, 1, 2, 3) // [0 0 0 0 0 0 0 0 0 0 1 2 3] fmt.Println(s) }
2.slice拼接問(wèn)題
代碼如下(示例):
package main import "fmt" func main() { // 三元素切片 s1 := []int{1, 2, 3} // 兩元素切片 s2 := []int{4, 5} // 將 s2 兩元素從末尾插入 s1 // s2... 即將 s2 導(dǎo)出 // s2... 此時(shí) 4,5 s1 = append(s1, s2...) fmt.Println(s1) }
3.new和make的區(qū)別
二者都是內(nèi)存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于類型的內(nèi)存分配,并且內(nèi)存置為零。所以在我們編寫(xiě)程序的時(shí)候,就可以根據(jù)自己的需要很好的選擇了。
make返回的還是這三個(gè)引用類型本身;而new返回的是指向類型的指針。
總結(jié)
通過(guò)以上兩個(gè)例子可以輕松了解在Golang中數(shù)組和切片的正常形式與簡(jiǎn)單初始化。
到此這篇關(guān)于Golang中數(shù)組和切片的文章就介紹到這了,更多相關(guān)Golang數(shù)組和切片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法
這篇文章主要介紹了Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法,涉及Go語(yǔ)言字符串遍歷與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Go用兩個(gè)協(xié)程交替打印100以內(nèi)的奇偶數(shù)的方法詳解
這篇文章主要給大家詳細(xì)介紹了Go用兩個(gè)協(xié)程交替打印100以內(nèi)的奇偶數(shù)的示例代碼,文中給大家介紹了兩個(gè)實(shí)現(xiàn)方法,使用無(wú)緩沖的channel和設(shè)置GOMAXPROCS=1,介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08Ubuntu下安裝Go語(yǔ)言開(kāi)發(fā)環(huán)境及編輯器的相關(guān)配置
這篇文章主要介紹了Ubuntu下安裝Go語(yǔ)言開(kāi)發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下2016-02-02Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單Web服務(wù)器的方法
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單Web服務(wù)器的方法,實(shí)例分析了Web服務(wù)器的實(shí)現(xiàn)原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02