main.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. 1. 测试golang slice扩展长度的规则
  3. 2. 测试golang slice切割后cap的变化
  4. 结论:
  5. 1. slice cap空间够的时候,cap不变,cap不够的时候,会乘2.
  6. 2. slice切割后的cap为原slice切割时的起始位置往后的长度
  7. */
  8. package main
  9. import "fmt"
  10. func main() {
  11. var ary = make([]int32, 1, 1)
  12. var strAry []string
  13. ary[0] = 1
  14. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  15. ary = append(ary, 2)
  16. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  17. ary = append(ary, 3)
  18. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  19. ary = append(ary, 4)
  20. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  21. ary = append(ary, 5)
  22. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  23. fmt.Println("-----------------------------------------")
  24. ary = make([]int32, 3, 3)
  25. fmt.Printf("value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  26. strAry = make([]string, 3, 3)
  27. fmt.Printf("value: %v, len: %v, cap: %v\n", strAry, len(strAry), cap(strAry))
  28. fmt.Println("-----------------------------------------")
  29. var subAry []int32
  30. // int32占用四个字节, 所以ary, subAry的地址应该也差4
  31. ary = make([]int32, 0, 5)
  32. subAry = ary[1:3]
  33. fmt.Printf("ary addr: %p, subAry addr: %p\n", ary, subAry)
  34. fmt.Println("-----------------------------------------")
  35. ary = make([]int32, 5, 5)
  36. subAry = ary[1:4]
  37. subAry[0] = 1
  38. fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  39. fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry))
  40. ary = make([]int32, 10, 10)
  41. subAry = ary[1:4]
  42. subAry[0] = 1
  43. fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  44. fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry))
  45. ary = make([]int32, 10, 10)
  46. subAry = ary[0:1]
  47. subAry[0] = 1
  48. fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  49. fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry))
  50. ary = make([]int32, 10, 10)
  51. subAry = ary[4:5]
  52. subAry[0] = 1
  53. fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  54. fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry))
  55. ary = make([]int32, 10, 10)
  56. subAry = ary
  57. subAry[0] = 1
  58. fmt.Printf("ary value: %v, len: %v, cap: %v\n", ary, len(ary), cap(ary))
  59. fmt.Printf("subAry value: %v, len: %v, cap: %v\n", subAry, len(subAry), cap(subAry))
  60. }