分页切片

时间:2013-12-28 16:42:39

标签: go

在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()]
}

link to playground

Go中有更好的方法吗?

由于

3 个答案:

答案 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值会导致超出范围错误,则此库会负责返回空切片。