go菜鸟请教: return b[n-num : n : n] 两个冒号是什么意思啊?
我也是第一次看到这种写法,猜和切片的len和cap有关,果然,经过我一会儿的实验得出如下结论。
```
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(a, len(a), cap(a))
b := a[2:4]
fmt.Println(b, len(b), cap(b))
b = a[2:4:5]
fmt.Println(b, len(b), cap(b))
b = a[2:4:4]
fmt.Println(b, len(b), cap(b))
结果:
[1 2 3 4 5 6 7 8 9] 9 9
[3 4] 2 7
[3 4] 2 3
[3 4] 2 2
```
根据上述结果可以得出
a[n:m] 这种方式实际上会把n下标及以后的切片截取出来,包括后面还未使用的容量部分也截取
a[n:m:o] 这时o<m 或 o > len(a)会触发panic,因为o是可以限定切片容量
至于问题 return b[n-num : n : n] ,显然是将第n-num位到n位截取,
并且新的切片cap=len避免返回结果容量大于长度造成内存占用吧。
上述做法在新切片不会涉及append操作(及可能重新申请内存)时可保证结果占用内存最小,
看来以后这个要加入我的技巧中了。
不然
a := make([]byte, 1024)
b := a[:n] 这种写法b的容量cap仍然是1024,明显浪费内存。
以上就是我得到的结论,有可能关于浪费内存的说法有误,但是这种写法应该看来是比较推荐的吧。
#1