2020 10 15Go語言切片

2021-10-24 19:34:07 字數 3656 閱讀 5827

go 語言切片是對陣列的抽象。

go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片("動態陣列"),與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

宣告切片型別的基本語法如下:

var 切片名稱  元素型別
示例:

package main

import "fmt"

func main()

fmt.println(slice) //[1 2 3]

fmt.println(slice) //[1 2 3 4]

}

nil表示空,也就是陣列初始化的預設值就是nil

當宣告乙個變數,但卻還沒有賦值時,golang中會自動給你定義的變數賦乙個預設值,每種型別對應的預設值如下:

切片的遍歷和陣列是一樣的

package main

import "fmt"

func main()

fmt.println(slice) //[1 2 3]

fmt.println(slice) //[1 2 3 4]

for i := 0; i < len(slice); i++

for index, value := range slice

}

由於切片的底層就是乙個陣列,所以我們可以直接基於陣列來定義切片

//基於陣列定義切片

a := [5]int

fmt.println(a)

//獲取陣列所有值

b := a[:]

fmt.println(b)

//從陣列獲取指定的切片

c := a[1:4]

fmt.println(c)

//獲取下標3之前的資料(不包括3)

d := a[:3]

fmt.println(d)

//獲取下標3之後的資料(包括三)

e := a[3:]

fmt.println(e)

//[11 12 13 14 15]

//[11 12 13 14 15]

//[12 13 14]

//[11 12 13]

//[14 15]

切片的長度和容量切片擁有自己的長度和容量,我們可以通過使用內建的 len() 函式求長度,使用內建的 cap() 函式求切片的容量

切片的長度就是它所包含的元素個數

切片的容量是從他的第乙個元素開始數,到其底層陣列元素末尾的個數

// 長度和容量

s := int

fmt.printf("長度%d 容量%d\n", len(s), cap(s))

ss := s[2:]

fmt.printf("長度%d 容量%d\n", len(ss), cap(ss))

sss := s[2:4]

fmt.printf("長度%d 容量%d\n", len(sss), cap(sss))

切片的本質就是對底層陣列的封裝,它包含了三個資訊

舉個例子,現在有乙個陣列 a := [8]int ,切片 s1 := a[:5],相應示意圖如下

我們上面都是基於陣列來建立切片的,如果需要動態的建立乙個切片,我們就需要使用內建的make函式,格式如下:

make (元素型別, 切片數量,切片容量 )
舉例:

// make()函式建立切片

var slices = make(int, 4, 8)

//[0 0 0 0]

fmt.println(slices)

// 長度:4, 容量8

fmt.printf("長度:%d, 容量%d", len(slices), cap(slices))

slices2 := int

fmt.println(slices2)

// 輸出結果 [1 2 3 4 5]

切片還可以將兩個切片進行合併

slices2 := int

fmt.println(slices2)

// 輸出結果 [1 2 3 4 5]

slices3 := int

fmt.println(slices2) // 輸出結果[1 2 3 4 5 6 7 8]

前面我們知道,切片就是引用資料型別

如果我們需要改變切片的值,同時又不想影響到原來的切片,那麼久需要用到copy函式

slices4 := int

var slice5 = make(int,4,8)

copy(slice5,slices4)

slice5[0] = 4

fmt.println(slices4) //輸出結果[1 2 3 4]

fmt.println(slice5)//輸出結果[4 2 3 4]

go語言中並沒有刪除切片元素的專用方法,我們可以利用切片本身的特性來刪除元素。**如下

// 刪除切片中的值

var slices6 = int

// 刪除下標為1的值

fmt.println(slices6)

氣泡排序演算法

func main() 

for i := 0; i < len(numslice); i++

} if !flag

} fmt.println(numslice)

}

選擇排序

// 編寫選擇排序

var numslice2 = int

for i := 0; i < len(numslice2); i++

}}fmt.println(numslice2)

對於int、float64 和 string陣列或是切片的排序,go分別提供了sort.ints()、sort.float64s() 和 sort.strings()函式,預設都是從小到大進行排序

var numslice2 = int

sort.ints(numslice2)

fmt.println(numslice2)

golang的sort包可以使用 sort.reverse(slic e) 來調換slice.inte***ce.less,也就是比較函式,所以int、float64 和 string的逆序排序函式可以這樣寫

// 逆序排列

var numslice4 = int

sort.sort(sort.reverse(sort.intslice(numslice4)))

fmt.println(numslice4)

2020 10 15Go語言陣列

陣列是具有相同唯一型別的一組已編號,且長度固定的資料項序列。這種型別可以使任意的原始型別例如 int float string以及自定義型別等等。golang中陣列的另乙個特點是占用記憶體的連續性,也就是說陣列中的元素是被分配進乙個連續的記憶體位址中,因此通過索引獲取陣列元素的速度會非常快。和陣列相...

2020 10 15Go語言之函式

函式是組織好的 可重複使用 用於執行指定任務的基本 塊 go語言支援 函式 匿名函式和閉包 go語言中定義函式使用 func 關鍵字,具體格式如下 func 函式名 引數 返回值型別 package main import fmt func main 單返回值 計算 a b func sum a i...

Go語言切片

go語言切片 go語言切片是對陣列的抽象 go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。宣告乙個未指定大小的陣列來定義切片 var identifier ...