高朗分页

I need to implement pagination. Actually I have pages array, page param and per_page variable. In my code:

pages_count := math.Floor(float64(len(pages)) / float64(per_page))

then in template I need something like (pseudocode):

{{ if .page - 2 > 0 }}
    {{ $start_page := .page - 2 }}
{{ else }}
    {{ $start_page := 1 }}
{{ end }}

{{ if .page + 2 >= .pages_count }}
    {{ $finish_page := .page + 2 }}
{{ else }}
    {{ $finish_page := .pages_count }}
{{ end }}

<ul>
    {{ for $i := $start_page; $i <= $finish_page; ++$i }}
        <li {{ if $i == .page }} class="current_page" {{ end }}>
            <a href="{{ url "Pages.Show" .$i }}">$i</a>
        </li>
    {{ end }}
</ul>

How to implement this correctly? Thx

When I work with Java templates (e.g. Velocity), I find that the kinds of template logic you are asking about lead to over-complex templates. The same applied in Go.

My solution is to move logic into the view-model layer and keep the templates rather dumb. This means that the controller and view model have to do a bit more work precomputing the kinds of values that your template shows. The view model is consequently larger - but it's just simple data and is easy to unit-test.

In your specific example, you would keep the for-loop that builds up the <li> list. Everything above the <ul> open tag can be handled in the view model. So the template would just work with some precomputed data.