golang常用手冊之切片(Slice)原理
切片,這是一個在go語言中引入的新的理念。它有一些特征如下:
- 對數(shù)組抽象
- 數(shù)組長度不固定
- 可追加元素
- 切片容量可增大
- 容量大小成片增加
我們先把上面的理念整理在這里,但是實際的還是要擼碼來解決問題。
定義或申明切片
首先我們看看申明切片:
var sliceName []type
定義完成后,我們需要定義切片:
sliceName = make([]type, len)
也可以適當簡寫:
sliceName := make([]type, len)
在上面的例子中,我們申明了一個切片,我們現(xiàn)在先運行看看結果。
package main
import "fmt"
func main() {
sliceName := make([]string, 3)
fmt.Printf("切片slice_name的長度:len=%d \n", len(sliceName))
}
//運行結果如下:
/*
* 切片slice_name的長度:len=3
*/
那么看到這里小伙伴們是不是發(fā)現(xiàn)切片,也就是我們普通的一個數(shù)組,那么它憑什么叫做切片呢?
我么可以看到另外一個make函數(shù): make([]T, length, capacity)
在上面的capacity是數(shù)組的容量,length則是數(shù)組的長度。當新插入元素后長度超過容量,則會自動增加一個容量來填裝數(shù)據(jù),但是 切片的空間大小是 capacity的整數(shù)倍 。demo如下:
package main
import "fmt"
func main() {
sliceName := make([]string, 3, 15)
fmt.Printf("切片slice_name的長度:len=%d cap=%d \n", len(sliceName), cap(sliceName))
sliceName[0] = "程先生"
fmt.Println(sliceName)
//運行結果如下:
/*
* 切片slice_name的長度:len=3 cap=15
* [程先生 ]
*/
}
初始化切片
任何變量或常量在使用之前都需要初始化,不過常量是直接把申明和初始化寫在一起的。我們來看看切片的初始化:
//初始化數(shù)組
arr := [] int{1, 2, 3}
fmt.Println(arr)
//初始化切片 sliceName 是 數(shù)組arr 的引用
sliceName := arr[:]
fmt.Println(sliceName)
//當然切片引用數(shù)組的標準寫法是: s := arr[startIndex:endIndex]
//其中startIndex和endIndex都可以省略。
//省缺startIndex則是數(shù)組下標為0,endIndex省略則是下標為 len-1
//運行結果如下:
//[1 2 3]
//[1 2 3]
sliceName1 := arr[1:3]
fmt.Println(sliceName1)
//截取切片元素下標從 1開始到3但是并不包括3 并復制給切片sliceName1
//運行結果:[2 3]
當然切片也會存在空對象nil的情況,在你申明后不初始化的情況下則會產(chǎn)生nil。
切片的增刪改查
當我們創(chuàng)建了一個切片后,我們需要對切片的元素進行增加該怎么辦呢? 我們可以看到內(nèi)置append函數(shù): func append(slice []Type, elems ...Type) []Type,代碼如下:
//首先我們需要先把原來的切片和欲添加元素作為參數(shù)加入到append函數(shù)中, //并且append會返回一個新的切片,所以代碼如下: sliceName = append(sliceName, 4) fmt.Println(sliceName) //運行結果如下: // [1 2 3 4]
當然我們順帶看下 copy函數(shù)如下:
// The copy built-in function copies elements from a source slice into a destination slice. // Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst). func copy(dst, src []Type) int // 上面的說明中指出 我們目標切片接受源數(shù)組,并且返回被拷貝的元素個數(shù)。
當然,go語言并沒有提供內(nèi)置的remove函數(shù),但是我們可以通過append函數(shù)實現(xiàn),如下:
//移除某個position的元素 //主要思路就是把該位置之前的數(shù)據(jù)和后面的數(shù)據(jù)組合到一起并賦值給原先的數(shù)組 sliceName = append(sliceName[:position],sliceName[position+1:]...)
總結
- 切片其實就是數(shù)組
- 切片的數(shù)組大小是能夠變化的
- 切片的容量增加是整數(shù)倍的
- 任何對象都有可能為空nil
- 內(nèi)置函數(shù)append和copy的使用
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Go實現(xiàn)后臺任務調(diào)度系統(tǒng)的實例代碼
平常我們在開發(fā)API的時候,前端傳遞過來的大批數(shù)據(jù)需要經(jīng)過后端處理,如果后端處理的速度快,前端響應就快,反之則很慢,影響用戶體驗,為了解決這一問題,需要我們自己實現(xiàn)后臺任務調(diào)度系統(tǒng),本文將介紹如何用Go語言實現(xiàn)后臺任務調(diào)度系統(tǒng),需要的朋友可以參考下2023-06-06
golang struct擴展函數(shù)參數(shù)命名警告解決方法
今天在使用VSCode編寫golang代碼時,定義一個struct,擴展幾個方法,需要的朋友可以參考下2017-02-02

