go菜鸟请教: return b[n-num : n : n] 两个冒号是什么意思啊?请大侠指点一下,多谢!

13611161621 · · 1167 次点击
jan-bar
想要拥有,必定付出。
我也是第一次看到这种写法,猜和切片的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