slice 是 go的里数组 一个view 。类似于指针显示一个数组的部分内容或者全部内容。
如图:
比如 slice1 指向arr1 数组,slice1修改2元素。对应的 arr1里面数据也会改变的。 slice有 ptr cap len len属性。 len代表slice长度也就是元素个数 ,cap是数组的边界
ptr指向slice开头的那个元素
len slice的长度是多少,用于判断slice长度,比如越界会根据len来判断的。
cap 是代表arr1的slice开头位置ptr到cap的整个长度。 只要不超过cap就有就能一直向后扩展,slice不能向前扩展。cap还有一个作用,比如append增加元素。如果长度超过cap。go语言中cap不会增加。而是重新开辟一个内建空间 cap 以*2的方式增加。具体看 go源码 https://github.com/golang/go/blob/master/src/runtime/slice.go#L95 扩充策略应该是综合扩充成本,内存消耗,数据分析,经验等的最终选择。
package main
import "fmt"
func updateSlice(s []int) {
s[0] = 100
}
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println("arr[2:6] =", arr[2:6])
fmt.Println("arr[:6] =", arr[:6])
s1 := arr[2:]
fmt.Println("arr[2:] s1=", s1)
s2 := arr[:]
fmt.Println("arr[:] s2=", s2)
fmt.Println("After updateSlice(s1)") //slice 类型不是值传递,是类似引用传递,arr的一个视图,在视图view上修改值 arr 也会进行改变的。
updateSlice(s1)
fmt.Println(s1)
fmt.Println(arr)
fmt.Println("After updateSlice(s2)")
updateSlice(s2)
fmt.Println(s2)
fmt.Println(arr)
fmt.Println("Reslice")
fmt.Println(s2)
s2 = s2[:5]
fmt.Println(s2)
s2 = s2[2:]
fmt.Println(s2)
fmt.Println("Extending slice")
arr[0], arr[2] = 0, 2
s1 = arr[2:6]
s2 = s1[3:5]
fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n", s1, len(s1), cap(s1))
fmt.Println("s2=", s2)
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)
fmt.Println("s3,s4,s5=", s3, s4, s5)
fmt.Println("arr=", arr)
}
package main
import "fmt"
func printSlice(s []int) {//打印slice
fmt.Printf("%vlen = %d,cap=%d,\n", s, len(s), cap(s))
}
func main() {
fmt.Println("Creating Slice") //创建slice
var s []int //类型slice
for i := 0; i < 100; i++ {
printSlice(s)
s = append(s, 2*i+1)
}
fmt.Println(s)
s1 := []int{2, 4, 6, 8}
printSlice(s1)
s2 := make([]int, 16)
printSlice(s2)
s3 := make([]int, 10, 32)
printSlice(s3)
fmt.Println("Copying slice") //拷贝slice
copy(s2, s1)
printSlice(s2)
fmt.Println("Deleting elements from slice") //删除slice 元素
s2 = append(s2[:3], s2[4:]...) //删除slice 中间元素
printSlice(s2)
fmt.Println("Popping from front") //去掉slice头部元素
front := s2[0]
s2 = s2[1:]
println(front)
printSlice(s2)
fmt.Println("Popping from back") //去掉slice尾部元素
tail := s2[len(s2)-1]
s2 = s2[:len(s2)-1]
fmt.Println(tail)
printSlice(s2)
}
原创文章,作者:星辰,如若转载,请注明出处:http://www.z88j.com/307.html