对于以下代码:
func Insert(m []Bucket, key string, value float64) {
bucketNumber := (key[0] - 'A') / 7
if cap(m[bucketNumber]) == 0 {
m[bucketNumber] = make([]Entry, 0, 100)
}
var bucketFull bool
bucketFull = len(m[bucketNumber]) == cap(m[bucketNumber])
if bucketFull {
m[bucketNumber] = append(m[bucketNumber], Entry{key, value})
} else {
m[bucketNumber][emptyPosition[bucketNumber]] = Entry{key, value}
}
emptyPosition[bucketNumber]++
}
m[bucketNumber][emptyPosition[bucketNumber]] = Entry{key, value}
给出错误
紧急:运行时错误:索引超出范围[0],长度为0`
尽管 m[bucketNumber] = make([]Entry, 0, 100)
为什么分配失败并出现运行时错误?
make([]Entry, 0, 100)
创建一个切片,该切片的长度为0,容量为100。索引必须小于长度。
因此,如果长度为0
,则偶数索引0
超出范围。
如果要创建包含100个元素的切片,请使用
make([]Entry, 100, 100)
或者简单地
make([]Entry, 100)
当您将元素附加到切片时,第三个参数(容量)用于减少将来的分配。
如果确实要创建长度为0的切片,请使用内置append()
函数向切片添加元素,例如:
s := make([]int, 0, 10)
s = append(s, 1)
您的具体问题:
bucketFull = len(m[bucketNumber]) == cap(m[bucketNumber])
这仅检查长度是否等于容量。对于新分配的切片(带有make([]Entry, 0, 100)
),这显然是false
(0
不等于100
),但这并不意味着您可以分配给切片的元素。如前所述,索引必须小于长度。
此bucketFull
属性仅指示是否可以在不重新分配的情况下将新元素添加到切片。可以使用内置append()
函数来添加新元素,或者使用内置函数append()
或切片表达式来对切片进行切片。
阅读博客文章以了解切片和数组:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句