在Go中对切片进行分页的最佳方法是什么,以避免像panic: runtime error: slice bounds out of range
例如,如果我有像
这样的切片slice := []int{1, 2, 3, 4, 5, 6, 7}
我打电话
slice[6:10]
我得到了一个恐慌错误。
我想出了这个:
func paginate(x []int, skip int, size int) []int {
limit := func() int {
if skip+size > len(x) {
return len(x)
} else {
return skip + size
}
}
start := func() int {
if skip > len(x) {
return len(x)
} else {
return skip
}
}
return x[start():limit()]
}
Go中有更好的方法吗?
由于
答案 0 :(得分:12)
嗯,虽然没有好办法,但我认为如果你使用变量而不是函数会更清晰。删除else子句时,它看起来也更干净。
func paginate(x []int, skip int, size int) []int {
if skip > len(x) {
skip = len(x)
}
end := skip + size
if end > len(x) {
end = len(x)
}
return x[skip:end]
}
答案 1 :(得分:1)
为什么限制某种切片类型?
func Paginate(pageNum int, pageSize int, sliceLength int) (int, int) {
start := pageNum * pageSize
if start > sliceLength {
start = sliceLength
}
end := start + pageSize
if end > sliceLength {
end = sliceLength
}
return start, end
}
start, end := Paginate(pageNum, pageSize, len(someSlice))
pagedSlice := someSlice[start:end]
答案 2 :(得分:0)
我刚刚找到go-linq,其灵感来自Microsoft Linq
要分页,就像我发布的问题一样,你会写:
From(x).Skip(0).Take(10)
您将获得预期的结果。如果您的Skip
和/或Take
值会导致超出范围错误,则此库会负责返回空切片。