分页切片

fmp*_*ard 2 go

什么是在Go中对切片进行分页并避免错误的最佳方法 panic: runtime error: slice bounds out of range

例如,如果我有一个切片

slice := []int{1, 2, 3, 4, 5, 6, 7}
Run Code Online (Sandbox Code Playgroud)

我打电话给

slice[6:10]
Run Code Online (Sandbox Code Playgroud)

我得到了恐慌错误.

我想出了这个:

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()]
}
Run Code Online (Sandbox Code Playgroud)

链接到游乐场

在Go中有更好的方法吗?

谢谢

Ste*_*erg 14

好吧,虽然没有很好的方法,但我认为如果你使用变量而不是函数会更干净.删除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]
}
Run Code Online (Sandbox Code Playgroud)


vla*_*tin 7

为什么要限制到某个切片类型?

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
}
Run Code Online (Sandbox Code Playgroud)
    start, end := Paginate(pageNum, pageSize, len(someSlice))
    pagedSlice := someSlice[start:end]
Run Code Online (Sandbox Code Playgroud)

  • 难道不应该吗?**开始 := (pageNum-1) * pageSize** (2认同)