map 中存在 slice,slice 和 array 有点类似,但是又有区别。slice 的 api 并没有 Python 中 list那么的丰富。
切片又可以称为动态数组,切片的长度是可以改变的。切片由三个部分组成:指向底层数组的指针,切片的元素个数(长度),切片的容量。切片是引用类型。
切片指向的是底层的数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package main
import "fmt"
func main() { var sliceVaribles []int arrayVariables := [...]int{12, 21, 23, 55, 98, 2} sliceVaribles = arrayVariables[:]
for i := 0; i < len(arrayVariables); i++ { fmt.Printf("数组元素:%d 的地址为:%d\n", arrayVariables[i], &arrayVariables[i]) }
for i := 0; i < len(sliceVaribles); i++ { fmt.Printf("切片元素:%d 的地址为:%d\n", sliceVaribles[i], &sliceVaribles[i]) }
var sliceVariables2 [] int sliceVariables2 = arrayVariables[1:3] fmt.Println(sliceVariables2)
for i := 0; i < len(sliceVariables2); i++ { fmt.Printf("切片元素:%d 的地址为:%d\n", sliceVariables2[i], &sliceVariables2[i]) }
sliceVariables2[0] = 100 fmt.Println(arrayVariables) fmt.Println(sliceVaribles) fmt.Println(sliceVariables2) }
|
切片是动态数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package main
import "fmt"
func main() { var sliceVariable = make([]int, 5, 6) fmt.Printf("切片长度为:%d, 容量为:%d\n", len(sliceVariable), cap(sliceVariable)) fmt.Printf("切片底层数组地址为:%p, 切片地址为:%p\n", sliceVariable, &sliceVariable)
sliceVariable = append(sliceVariable, 0,1,2,3,4) fmt.Printf("切片长度为:%d, 容量为:%d\n", len(sliceVariable), cap(sliceVariable)) fmt.Printf("切片底层数组地址为:%p, 切片地址为:%p\n", sliceVariable, &sliceVariable)
}
|
创建slice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var s []int
for i:=0; i< 100;i++{ s = append(s, 2 * i * 1) } fmt.Println(s)
s2 := make([]int, 16) fmt.Println(len(s2)) fmt.Println(cap(s2)) fmt.Println(s2)
s3 := make([]int, 16, 32) fmt.Println(len(s3)) fmt.Println(cap(s3)) fmt.Println(s3)
|
切
在 go 中,切片操作和 Python 的中的差不多,例如 a[2:6] 即取 a 中第2个元素到第5个元素(左闭右开) 在 go 中也同样有 [:] ,[1:],[:8] 等操作。
不同点:
Python
1 2 3 4 5 6
| a = [1, 2, 3, 4, 5, 6, 7, 8, 9] b = a[:6] c = b[5:9]
print(b) print(c)
|
go
1 2 3 4 5 6 7 8 9 10 11
| package main
import "fmt"
func main(){ a := [...]int{1,2,3,4,5,6,7,8,9} b := a[:6] c := b[5:9] fmt.Println(b) fmt.Println(c) }
|
追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| a := [...]int{1,2,3,4,5,6,7,8,9} b := a[:8] c := append(b, 10) fmt.Println(cap(c)) fmt.Println(c)
fmt.Println("----------")
d := append(c, 11) fmt.Println(cap(d)) fmt.Println(d)
|
copy
1 2 3
| copy(s2, d) fmt.Println(s2)
|
delete
1 2 3 4
| fmt.Println(s2) s2 = append(s2[:3], s2[4:]...) fmt.Println(s2)
|
删除头元素
1 2 3 4 5 6
| fmt.Println(s2)
front := s2[0] s2 = s2[1:] fmt.Println(front, s2)
|
删除尾元素
1 2 3 4
| back := s2[len(s2)-1] s2 = s2[:len(s2)-1] fmt.Println(back, s2)
|
slice 和数组的区别
https://segmentfault.com/a/1190000013148775