Go語言--切片(Slice)詳解

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ò)

以及勤勞的自己

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 切片(slice)是 Golang 中一種比較特殊的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)更便于使用和管理數(shù)據(jù)集合。切片是圍繞動(dòng)態(tài)...
    51reboot閱讀 28,863評(píng)論 2 10
  • 切片(slice)是 Golang 中一種比較特殊的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)更便于使用和管理數(shù)據(jù)集合。切片是圍繞動(dòng)態(tài)...
    小孩真笨閱讀 1,219評(píng)論 0 1
  • 數(shù)組Go語言中的數(shù)組是定長的同一類型數(shù)據(jù)的集合,數(shù)組索引是從0開始的。數(shù)組有以下幾種創(chuàng)建方式 以下是一些特殊數(shù)組 ...
    小杰的快樂時(shí)光閱讀 1,970評(píng)論 0 0
  • 米贏文化閱讀 369評(píng)論 0 1
  • 染柳煙濃,吹梅笛怨,春意知幾許。 此時(shí)已經(jīng)是凌晨左右了,依然毫無睡意,即便中午沒有午休,下午認(rèn)真看書練題了。最近很...
    不酷的我不喜歡閱讀 1,983評(píng)論 0 1

友情鏈接更多精彩內(nèi)容