gpt4 book ai didi

go - 扩展 slice 的大小以防止 slice 边界超出范围错误

转载 作者:IT王子 更新时间:2023-10-29 01:41:54 27 4
gpt4 key购买 nike

我写了以下内容:

func main() {
//inside main
fileInputBytes, err := ioutil.ReadFile("/tmp/test")
byteSize2 := len(fileInputBytes)

var inputFileByteSlice = fileInputBytes[0:]
var numberOfIndexes = math.Floor(float64(byteSize / indexingOffset))

for i := 1; i <= int(numberOfIndexes); i++ {
// adding i to the indexer insures that we use lookahed to ignore previously inserted indexing values
var v int = (i * indexingOffset) + i
Insert(&inputFileByteSlice, v+i, indexingByteValue)
fmt.Println(i)
}
}
//outside main
//variation of https://blog.golang.org/slices with pointers and such
func Insert(slice *[]byte, index int, value byte) {
// Grow the slice by one element.
(*slice) = (*slice)[0 : len(*slice)+1]
// Use copy to move the upper part of the slice out of the way and open a hole.
copy((*slice)[index+1:], (*slice)[index:])
// Store the new value.
(*slice)[index] = value
// Return the result.
}

slice bounds out of range 错误让我很不安。 slice 的长度超出大小并溢出,我不明白的原因是我认为调用一个元素(在复制之前)“增长” slice 将动态分配更多空间。既然不是这样,谁能给我更好的建议?

最佳答案

首先, slice 已经是一个引用类型。因此,如果您不打算更改其容量,则无需传递其指针。所以你的 main 可以简化为:

func main() {
fileInputBytes, err := ioutil.ReadFile("/tmp/test")
byteSize2 := len(fileInputBytes)

// No need to use pointer to slice. If you want a brand new slice
// that does not affect the original slice values, use copy()
inputFileByteArray := fileInputBytes
var numberOfIndexes = math.Floor(float64(byteSize / indexingOffset))

for i := 1; i <= int(numberOfIndexes); i++ {
var v int = (i * indexingOffset) + i

// Insert needs to return the newly updated slice reference
// which should be assigned in each iteration.
inputFileByteArray = Insert(inputFileByteArray, v+i, indexingByteValue)
fmt.Println(i)
}
}

然后,Insert 函数可以简单地通过使用 appendcopy 并返回新创建的 slice 来简化:

func Insert(slice []byte, index int, value byte) []byte {
if index >= len(slice) {
// add to the end of slice in case of index >= len(slice)
return append(slice, value)
}
tmp := make([]byte, len(slice[:index + 1]))
copy(tmp, slice[:index])
tmp[index] = value
return append(tmp, slice[index:]...)
}

这可能不是最好的实现,但它足够简单。用法示例位于:https://play.golang.org/p/Nuq4RX9XQD

关于go - 扩展 slice 的大小以防止 slice 边界超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39952080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com