Skip to content

Commit c21d406

Browse files
committed
update slice
1 parent b4b5dd7 commit c21d406

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

slice.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# slice
1+
# slice 和 array
22

33
要说 slice,那实在是太让人熟悉了,从功能上讲 slice 支持追加,按索引引用,按索引范围生成新的 slice,自动扩容等,和 C++ 或 Java 中的 Vector 有些类似,但也有一些区别。
44

@@ -13,7 +13,9 @@ type slice struct {
1313
}
1414
```
1515

16-
slice 的底层结构定义非常直观,指向底层数组的指针,当前长度 len 和当前slice 的 cap。
16+
slice 的底层结构定义非常直观,指向底层数组的指针,当前长度 len 和当前 slice 的 cap。
17+
18+
数据指针不一定就是指向底层数组的首部,也可以指腰上:
1719

1820
```
1921
@@ -38,7 +40,13 @@ slice 的底层结构定义非常直观,指向底层数组的指针,当前
3840
3941
```
4042

43+
我们可以轻松地推断出,是可以有多个 slice 指向同一个底层数组的。一般情况下,一个 slice 的 cap 取决于其底层数组的长度。如果在元素追加过程中,底层数组没有更多的空间了,那么这时候就需要申请更大的底层数组,并发生数据拷贝。这时候的 slice 的底层数组的指针地址也会发生改变,务必注意。
44+
45+
## len 和 cap
46+
47+
Go 语言虽然将 len 和 cap 作为 slice 和 array 附带的 builtin 函数,但对这两个函数的调用实际上最终会被编译器直接计算出结果,并将值填到代码运行的位置上。所以 len 和 cap 更像是宏一样的东西,在 slice 和 array 的场景,会被直接展开为 sl->len 和 sl->cap 这样的结果。
4148

49+
## 源码分析
4250

4351
> Written with [StackEdit](https://stackedit.io/).
4452
<!--stackedit_data:

0 commit comments

Comments
 (0)