Go語言--切片(Slice)詳解
博客說明
文章所涉及的資料來自互聯(lián)網(wǎng)整理和個(gè)人總結(jié),意在于個(gè)人學(xué)習(xí)和經(jīng)驗(yàn)匯總,如有什么地方侵權(quán),請(qǐng)聯(lián)系本人刪除,謝謝!
說明
Go 語言切片是對(duì)數(shù)組的抽象。
Go 數(shù)組的長度不可改變,在特定場(chǎng)景中這樣的集合就不太適用,Go中提供了一種靈活,功能強(qiáng)悍的內(nèi)置類型切片("動(dòng)態(tài)數(shù)組"),與數(shù)組相比切片的長度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。
定義切片
注意:切片不需要說明長度
1、聲明一個(gè)未指定大小的數(shù)組來定義切片
var identifier []type
//例如
var slice []int
2、使用make()函數(shù)來創(chuàng)建切片
var slice1 []type = make([]type, len)
//也可以簡寫為
slice1 := make([]type, len)
//例如
slice := make([]type, len)
切片是可索引的
len() 和 cap() 函數(shù)
可以由 len() 方法獲取長度。
切片提供了計(jì)算容量的方法 cap() 可以測(cè)量切片最長可以達(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]
空(nil)切片
一個(gè)切片在未初始化之前默認(rèn)為 nil,長度為 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=[]
切片截取
可以通過設(shè)置下限及上限來設(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é)果

image-20200429103655417
增加切片的容量
原理:創(chuàng)建一個(gè)新的更大的切片并把原分片的內(nè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)
}

image-20200429104502086
感謝
菜鳥教程
萬能的網(wǎng)絡(luò)
以及勤勞的自己