/** 1. 测试golang slice扩展长度的规则 2. 测试golang slice切割后cap的变化 结论: 1. slice cap空间够的时候,cap不变,cap不够的时候,会乘2. 2. slice切割后的cap为原slice切割时的起始位置往后的长度 */ package main import "fmt" func main() { var ary = make([]int32, 1, 1) var strAry []string ary[0] = 1 fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) ary = append(ary, 2) fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) ary = append(ary, 3) fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) ary = append(ary, 4) fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) ary = append(ary, 5) fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Println("-----------------------------------------") ary = make([]int32, 3, 3) fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) strAry = make([]string, 3, 3) fmt.Printf("value: %v, len: %v, cap: %v\n", strAry, len(strAry), cap(strAry)) fmt.Println("-----------------------------------------") var subAry []int32 // int32占用四个字节, 所以ary, subAry的地址应该也差4 ary = make([]int32, 0, 5) subAry = ary[1:3] fmt.Printf("ary addr: %p, subAry addr: %p\n", ary, subAry) fmt.Println("-----------------------------------------") ary = make([]int32, 5, 5) subAry = ary[1:4] subAry[0] = 1 fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry)) ary = make([]int32, 10, 10) subAry = ary[1:4] subAry[0] = 1 fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry)) ary = make([]int32, 10, 10) subAry = ary[0:1] subAry[0] = 1 fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry)) ary = make([]int32, 10, 10) subAry = ary[4:5] subAry[0] = 1 fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry)) ary = make([]int32, 10, 10) subAry = ary subAry[0] = 1 fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary)) fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry)) }