对同一个slice进行不同切片操作,新的切片的cap会不同?搞不懂,例子程序如下:

package main

import "fmt"

func main() {
    a := make([]int, 5)

    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := b[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

得到结果是:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]

c,d的不同就是一个是 b[:2],一个是 b[2,5]

共 2 个回复


polaris

struct Slice { // must not move anything byte* array; // actual data uint32 len; // number of elements uint32 cap; // allocated number of elements }; 这是slice的内部实现 b[2:5],相当于起始点在2,也就是之前的2这个下表现在变成了0,根据数组的原理,2之前的元素是不可能再取到的,即,d不可能通过d[-1]、d[-2]拿到最开始的两个元素,自然cap也就变短了。

# 0

feihu

谢谢,也就是根据切片起点的不同,决定了新的slice的cap()。

# 1