Go语言——Slice

需要说明, slice 并不是数组或数组指针。它通过内部指针和相关属性引⽤数组⽚段,以实现变⻓⽅案。

runtime.h
struct Slice
{

     // must not move anything
    byte* array; // actual data
    uintgo len; // number of elements
    uintgo cap; // allocated number of elements
};
引⽤类型。但⾃⾝是结构体,值拷⻉传递。
属性 len 表⽰可⽤元素数量,读写操作不能超过该限
属性 cap 表⽰最⼤扩张容量,不能超出数组限制。
如果 slice == nil,那么 len、 cap 结果都等于 0。

1)创建表达式使⽤的是元素索引号,⽽⾮数量。如下图:

2)读写操作实际目标是底层数组,只需注意索引号的差别。如下图:

3)使⽤ make 动态创建 slice,避免了数组必须⽤常量做⻓度的⿇烦。还可⽤指针直接访问底层数组,退化成普通数组操作。如下:

s := []int{0, 1, 2, 3}
p := &s[2] // *int, 获取底层数组元素指针。
*p += 100
fmt.Println(s)

输出:
[0 1 102 3]

4)多维切片(二维切片)

5)append
向 slice 尾部添加数据,返回新的 slice 对象。

⼀旦超出原 slice.cap 限制,就会重新分配底层数组,
6)copy
函数 copy 在两个 slice 间复制数据,复制⻓度以 len ⼩的为准。两个 slice 可指向同⼀底层数组,允许元素区间重叠。


应及时将所需数据 copy 到较⼩的 slice,以便释放超⼤号底层数组内存。
 

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/82497581
今日推荐