GO語言基礎語法之切片(第十七天)

Go 語言切片(Slice),學習時候對比python 的切片
Go 數組的長度固定,切片是內置類型,長度是不固定的,可以追加(append)元素,在追加後容量(cap)增大。

定義切片

  • 聲明未指定大小的數組來定義切片:
    var identifier []type //切片不需要說明長度區別於數組。
  • 使用make()函數來創建切片:
    var slice1 []type = make([]type, len)
    也可以簡寫爲: slice1 := make([]type, len)
  • 指定容量,其中capacity爲可選參數。
    make([]T, length, capacity )// len 是數組的長度並且是切片的初始長度。

切片初始化

  • 直接初始化切片,[]表示是切片類型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
    s :=[] int {1,2,3 }
  • 初始化切片s,是數組arr的引用 , s := arr[:]
  • 創建爲一個新的切片,根據下標截斷 ,
    s := arr[startIndex:endIndex]
    s := arr[startIndex:] //默認 startIndex 時將表示一直到arr的最後一個元素
    s := arr[:endIndex] //默認endIndex 時將表示從arr的第一個元素開始
  • 通過切片s初始化切片s1,s1 := s[startIndex:endIndex]
  • 通過內置函數make()初始化切片s,s :=make([]int,len,cap)

len() 和 cap() 函數

切片是可索引的,由 len() 方法獲取長度。提供容量的方法 cap()

切片截取

設置下限及上限來設置截取切片

append() 和 copy() 函數

在做函數調用時,slice 按引用傳遞(可以修改調用者源數組內容),array 按值傳遞(不修改調用者的原數組內容)

package main

import "fmt"
func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
func main() {
	var slice []int
	printSlice(slice)

	/* 允許追加空切片 */

	slice = append(slice, 12)
	slice = append(slice, 0)
	printSlice(slice)

	/* 向切片添加一個元素 */
	slice = append(slice, 1)
	printSlice(slice)

	/* 同時添加多個元素 */
	slice = append(slice, 2,3,4)
	printSlice(slice)

	 /*拷貝切片需要先分配好空間*/
	/* 創建切片 numbers1 是之前切片的兩倍容量*/
	numbers1 := make([]int, len(slice), (cap(slice))*2)

	/* 拷貝 numbers 的內容到 numbers1 */
	copy(numbers1,slice)
	printSlice(numbers1)
}

C:\Go\bin\go.exe build -o C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe C:/Go/workspace/qiepian/qiepian.go #gosetup
C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe #gosetup
len=0 cap=0 slice=[]
len=2 cap=2 slice=[12 0]
len=3 cap=4 slice=[12 0 1]
len=6 cap=8 slice=[12 0 1 2 3 4]
len=6 cap=16 slice=[12 0 1 2 3 4]

Process finished with exit code 0

GO切片與python 切片的不同:

go有切片類型,python有列表和元組,都有切片操作。
切片方法使用是不同的。

  • go的切片,其成員是相同類型的,python的列表和元組則不限制類型。
  • 兩種語言都有[a:b]這種切片操作,意義也類似,go的a、b兩個index不能是負數,python可以是負數,此時就相當於從末尾往前數。
  • 兩種語言都有[a🅱️c]這種切片操作,意義卻是完全不同的。go的c,表示的是容量;而python的c表示的是步長。
  • python的切片產生的是新的切片對象,對新對象的成員的操作不影響舊對象,go的切片產生的是舊對象一部分的引用,對其成員的操作會影響舊對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章