介绍
读《network programming with golang》这本书,墙裂推荐。读这本书之前我并没有系统的学过这门语言。读到第十章,Dictionary内存分配的代码让我觉得有些困惑,为什么一个定义长度为100的数组不会越界
问题
书中代码如下
v := make([]*Entry, 0, 100)
for n := 0; n < len(d.Entries); n++ {
de := d.Entries[n]
if de.Pinyin == py {
v = append(v, de)
}
}
这段代码,看起来就是在最初创建了一个长度为100的数组,而后不断的通过append给它添加新的元素。添加多少个元素是不确定的,那么如果添加101个元素,会不会index of range呢?
实验
带着这个问题我做了如下实验。实验代码如下
package main
import "fmt"
func main(){
array := make([]int, 0, 10)
// 越界错误: index out of range
//array[0] = 1
// ok 可以访问
array = array[0:1]
array[0] = 1
// 越界错误: index out of range
// array[1] = 2
// 错误: slice bounds out of range
//array = array[0:11]
// ok 不会越界 一切正常
for i:=0; i<100; i++ {
array = append(array, i)
}
for i:=0; i<len(array); i+=1{
fmt.Println(i)
}
}
结论:
- 如果用make创建一个数组。第一个参数是类型,第二个参数是初始长度,第三个参数是预留长度。我这里采用[]int类型表示int数组,初始长度0,可扩展长度100
- 初始长度0,如果直接对array[0]赋值会报错,index out of range。需要手动slice一下(array = array[0:1]),才能够给array[0]赋值。
- 对array执行slice操作(array = array[0:1])之后,array[1]依然不能够直接操作,因为他在slice范围之外。
- 尝试对array进行大于预留空间的slice操作(array = array[0:11]),报错slice bounds out of range。
- 使用append方法给数组添加新元素,一切正常,数组会自动调整以适应当前内存需求。不会出现index out of range,也没有数次啊能slide bounds out of range错误