Golang Revel: разбиение на страницы массива структур

У меня есть массив структур, который мне нужно разбить на страницы в конце представления.

Вот как выглядит мой код в представлении:

<div class="tab-content">
        <div class="tab-pane active" id="tab1" >
          <hr/>
          {{range .c}}                
            <p>Number: {{.Number}}</p>
            <p>Name: {{.Name}}</p>
            <p>Parties: {{.A}} and {{.B}}</p>
            <p>Location: {{.Location}}</p>
          <a href="/search">Read More</a>
          <hr/>
          {{end}}
          <div class="paging">
            <ul class="pagination">
              <li><a href="#"><i class="fa fa-angle-left"></i></a></li>
              <li class="active"><a href="#">1</a></li>
              <li><a href="#">2</a></li>
              <li><a href="#">3</a></li>
              <li><a href="#">4</a></li>
              <li><a href="#">5</a></li>
              <li><a href="#"><i class="fa fa-angle-right"></i></a></li>
            </ul>
          </div>
        </div>

Я пытался найти решение для разбивки на страницы, потому что результаты исчисляются сотнями. Единственные решения golang, с которыми я сталкивался до сих пор, связаны с SQL. Я был бы очень признателен за решение для массива структур.

Заранее спасибо.

EDIT Мое внутреннее хранилище — BoltDB. Я получаю данные о контроллере, вызывая этот метод

func List(bucket string)  []Data{
    //Open BoltDB database
    Open()
    defer Close()
    //Use a predefined struct to make an array
    d:=make([]Data, 0)
    //Fetch and unmarshal data as it is saved in byte form
    db.View(func(tx *bolt.Tx) error {
        cur := tx.Bucket([]byte(bucket)).Cursor()
        for k, v := cur.First(); k != nil; k, v = cur.Next() {            
            d1:=Data{}
            err:= json.Unmarshal(v, &d1)
            if err !=nil{
                return err
            }
            d=append(d, d1)
        } 
        return nil  
    })
    //Return the array of data
    return d
}

Этот массив - это то, что я хотел бы повторить в представлении.


person Mardwan    schedule 06.01.2016    source источник
comment
Если вы не хотите внедрять решение на основе SQL (наиболее эффективное, наименее гибкое). Вы можете выполнять математику и перебирать набор результатов в javascript или делать ту же математику в своем контроллере Revel. Вам нужно будет рассчитать такие вещи, как total_pages = rows_returned/pagesize и т. д. Все становится немного сложнее, если вы хотите объединить фильтрацию и группировку.   -  person Perpetualcoder    schedule 06.01.2016
comment
Также сообщите нам, какой пакет вы используете для доступа к данным. Как выглядит контроллер?   -  person Perpetualcoder    schedule 06.01.2016
comment
Спасибо @Perpetualcoder за быстрый ответ. Я обновил вопрос. Я надеюсь, что это охватывает все, что вы просили.   -  person Mardwan    schedule 06.01.2016
comment
Я только что написал супер-непроверенный код, он должен дать вам подсказку о том, что можно сделать. Ваше здоровье!   -  person Perpetualcoder    schedule 06.01.2016
comment
Достаточно ли было решения?   -  person Perpetualcoder    schedule 07.01.2016
comment
Эй, @Perpetualcoder, честно говоря, ты, должно быть, один из самых добрых гуру! Я пытался найти способы внедрить решение в свой код, но далеко не продвинулся. Боюсь, мои навыки программирования не так хороши.   -  person Mardwan    schedule 07.01.2016
comment
Дайте мне знать, если вы хотите, чтобы я подправил ответ. Значение пропуска будет размером * (pageneeded-1), которое вам нужно будет передать контроллеру из вашего представления. В сообществе программистов мы растем, помогая другим. Когда-нибудь ты мне тоже поможешь.   -  person Perpetualcoder    schedule 07.01.2016


Ответы (1)


Вы можете собрать полный массив данных, которые вы возвращаете из функции списка.

func paginate(x []Data, 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()]
}

Хотя вы получите желаемое поведение, это очень расточительно с точки зрения памяти, особенно если ваш массив данных огромен. Надеюсь это поможет.

person Perpetualcoder    schedule 06.01.2016