Learn Golang in 21 Days - Day 10
摘要:
Learn Golang in 21 Days - Day 10
知識點
切片Slice
Slice是對陣列的抽象
Go陣列的長度不可改變,Go內建Slice動態陣列
定義切片
切片不需要說明長度
var identifier...
Learn Golang in 21 Days - Day 10
知識點
- 切片Slice
- Slice是對陣列的抽象
- Go陣列的長度不可改變,Go內建Slice動態陣列
定義切片
- 切片不需要說明長度
var identifier []type var slice1 []type = make([]type, len) //可以簡寫 slice1 := make([]type, len)
切片初始化
- 使用make可以初始化slice
s :=[] int {1,2,3,4,5} a := s[2:3] //直到最後一個元素 b := s[:4] s := make([]int, len, cap)
len()和cap()函式
- 切片是可以索引的,並且可以由len()方法獲取長度
- 切片提供了計算容量的方法cap()可以測量切片最長可以達到多少
package main import "fmt" func main() { var numbers = make([]int, 3,5) printSlice(numbers) } func printSlice(x []int) { fmt.Printf("len=%d, cap=%d, slice=%v\n", len(x), cap(x), x) }
nil slice
- 一個切片在未初始化之前預設為nil,長度為0
package main import "fmt" func main() { var numbers []int printSlice(numbers) if(numbers == nil) { fmt.Printf("slice is nil") }else{ fmt.Printf("slice is not nil") } } func printSlice(x []int) { fmt.Printf("len=%d,cap=%d,slice=%v\n",len(x),cap(x),x) }
Slice擷取
- 通過設定下限和上限來設定切片[low-bound:upper-bound],例項如下:
package main import "fmt" func main() { //建立切片 numbers := []int {0,1,2,3,4,5,6,7,8,9} printSlice(numbers) //列印原始切片 fmt.Println("numbers == ", numbers) //列印子切片從索引1到索引4 fmt.Println("numbers[1:4] == ", numbers[1:4]) //預設下限0 fmt.Println("numbers[:3] == ", numbers[:3]) //預設上限為len(s) fmt.Println("numbers[4:] ==", numbers[4:]) numbers1 := make([]int, 0,5) printSlice(numbers1) // 換一種方式初始化slice numbers2 := numbers1[2:8] printSlice(numbers2) // 換一種方式初始化slice numbers3 := numbers1[:8] printSlice(numbers3) } func printSlice(x []int) { fmt.Printf("len=%d,cap=%d,slice=%v\n",len(x),cap(x),x) }
append() 和 copy()
- 如果想增加切片的容量,我們必須建立一個新的更大的切片並把原分片的內容都拷貝過來
- 下面的程式碼描述了從拷貝切片的copy方法和向切片追加新元素的append方法
package main import "fmt" func main() { var numbers []int printSlice(numbers) // 允許追加空切片 numbers = append(numbers, 0) printSlice(numbers) // 向切片新增一個元素 numbers = append(numbers,1) printSlice(numbers) // 同時新增多個元素 numbers = append(numbers, 2,3,4) printSlice(numbers) // 擴容slice numbers1 := make([]int, len(numbers), (cap(numbers)*2)) printSlice(numbers1) // copy copy(numbers1, numbers) fmt.Println("---------------") printSlice(numbers1) } func printSlice(x []int) { fmt.Printf("len=%d,cap=%d,slice=%v\n",len(x),cap(x),x) }