Go語(yǔ)言--切片(Slice)詳解
說(shuō)明:
Go 語(yǔ)言切片是對(duì)數(shù)組的抽象。
Go 數(shù)組的長(zhǎng)度不可改變,在特定場(chǎng)景中這樣的集合就不太適用,Go中提供了一種靈活,功能強(qiáng)悍的內(nèi)置類(lèi)型切片("動(dòng)態(tài)數(shù)組"),與數(shù)組相比切片的長(zhǎng)度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。
一、定義切片
注意:切片不需要說(shuō)明長(zhǎng)度
1、聲明一個(gè)未指定大小的數(shù)組來(lái)定義切片
var identifier []type //例如 var slice []int
2、使用make()函數(shù)來(lái)創(chuàng)建切片
var slice1 []type = make([]type, len) //也可以簡(jiǎn)寫(xiě)為 slice1 := make([]type, len) //例如 slice := make([]type, len)
二、切片是可索引的
1、len() 和 cap() 函數(shù)
可以由 len()
方法獲取長(zhǎng)度。
切片提供了計(jì)算容量的方法 cap()
可以測(cè)量切片最長(zhǎng)可以達(dá)到多少
package main import "fmt" func main(){ var number = make([]int,3,5) fmt.Printf("len=%d cap=%d slice=%v\n",len(number),cap(number),number) } //len=3 cap=5 slice=[0 0 0]
2、空(nil)切片
一個(gè)切片在未初始化之前默認(rèn)為 nil,長(zhǎng)度為 0
package main import "fmt" func main(){ var number []int fmt.Printf("len=%d cap=%d slice=%v\n",len(number),cap(number),number) } //len=0 cap=0 slice=[]
三、切片截取
可以通過(guò)設(shè)置下限及上限來(lái)設(shè)置截取切片 [lower-bound:upper-bound]
package main import "fmt" func main() { //創(chuàng)建切片 number := []int{0, 1, 2, 3, 4, 5, 6, 7, 8} printSlice(number) //打印原始切片 fmt.Println("number == ", number) //打印子切片從索引1到索引4 fmt.Println("number == ", number[1:4]) //打印子切片默認(rèn)下限 fmt.Println("number == ", number[:3]) //打印子切片默認(rèn)上限 fmt.Println("number == ", number[4:]) } func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }
結(jié)果:
四、增加切片的容量
原理:創(chuàng)建一個(gè)新的更大的切片并把原分片的內(nèi)容都拷貝過(guò)來(lái)
append() 和 copy() 函數(shù) package main import ( "fmt" ) func main() { //創(chuàng)建切片 var number []int printSlice(number) //允許追加空切片 number = append(number,0) printSlice(number) //向切片添加一個(gè)元素 number = append(number,1) printSlice(number) //同時(shí)添加多個(gè)元素 number = append(number,2,3,4) printSlice(number) //創(chuàng)建的新的切片是之前的切片容量的兩倍 number1 := make([]int,len(number),(cap(number))*2) //拷貝number的內(nèi)容到number1中 copy(number1,number) printSlice(number1) } func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }
到此這篇關(guān)于Go語(yǔ)言--切片(Slice)詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言切片(Slice)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang并發(fā)編程使用Select語(yǔ)句的實(shí)現(xiàn)
Go語(yǔ)言中的select語(yǔ)句是并發(fā)編程中的重要工具,允許Goroutine等待多個(gè)通道操作,它阻塞直至任一case可執(zhí)行,可用于接收數(shù)據(jù)、實(shí)現(xiàn)超時(shí)機(jī)制和非阻塞通道操作,感興趣的可以了解一下2024-10-10實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE) 簡(jiǎn)介附go實(shí)現(xiàn)示例代碼
EventSource是一種非常有用的 API,適用于許多實(shí)時(shí)應(yīng)用場(chǎng)景,它提供了一種簡(jiǎn)單而可靠的方式來(lái)建立服務(wù)器推送連接,并實(shí)現(xiàn)實(shí)時(shí)更新和通知,這篇文章主要介紹了實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE)簡(jiǎn)介附go實(shí)現(xiàn)示例,需要的朋友可以參考下2024-03-03關(guān)于go-zero服務(wù)自動(dòng)收集問(wèn)題分析
這篇文章主要介紹了關(guān)于go-zero服務(wù)自動(dòng)收集問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Go語(yǔ)言開(kāi)發(fā)快速學(xué)習(xí)CGO編程
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)之快速學(xué)習(xí)CGO編程,看了本文你就會(huì)發(fā)現(xiàn)CGO編程其實(shí)沒(méi)有想象的那么難,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Go語(yǔ)言日志內(nèi)聚復(fù)用及gjson踩坑記錄分享
這篇文章主要為大家介紹了Go語(yǔ)言日志內(nèi)聚復(fù)用及gjson踩坑記錄分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go如何實(shí)現(xiàn)Websocket服務(wù)以及代理
這篇文章主要介紹了Go如何實(shí)現(xiàn)Websocket服務(wù)以及代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Go標(biāo)準(zhǔn)庫(kù)http?server的優(yōu)雅關(guān)閉深入理解
這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)http?server的優(yōu)雅有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪關(guān)閉深入理解2024-01-01