golang之内存管理make

楚天乐 1919 0 条

介绍

读《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)
    }
}

结论:

  1. 如果用make创建一个数组。第一个参数是类型,第二个参数是初始长度,第三个参数是预留长度。我这里采用[]int类型表示int数组,初始长度0,可扩展长度100
  2. 初始长度0,如果直接对array[0]赋值会报错,index out of range。需要手动slice一下(array = array[0:1]),才能够给array[0]赋值。
  3. 对array执行slice操作(array = array[0:1])之后,array[1]依然不能够直接操作,因为他在slice范围之外。
  4. 尝试对array进行大于预留空间的slice操作(array = array[0:11]),报错slice bounds out of range。
  5. 使用append方法给数组添加新元素,一切正常,数组会自动调整以适应当前内存需求。不会出现index out of range,也没有数次啊能slide bounds out of range错误


发表我的评论
'
昵称 (必填)
邮箱 (必填)
网址