Lặp lại bản đồ trong mẫu


91

Tôi đang cố gắng hiển thị danh sách các lớp tập gym (Yoga, Pilates, v.v.). Đối với mỗi loại lớp có một số lớp, vì vậy tôi muốn nhóm tất cả các lớp Yoga và tất cả các lớp Pilates, v.v.

Tôi thực hiện chức năng này để lấy một lát và tạo bản đồ của nó

func groupClasses(classes []entities.Class) map[string][]entities.Class {
    classMap := make(map[string][]entities.Class)
    for _, class := range classes {
        classMap[class.ClassType.Name] = append(classMap[class.ClassType.Name], class)
    }
    return classMap
}

Vấn đề là bây giờ làm thế nào tôi có thể lặp lại nó, theo http://golang.org/pkg/text/template/ , bạn cần phải truy cập nó ở .Keyđịnh dạng, tôi không biết các phím (trừ khi tôi cũng đã chuyển một lát của khóa vào mẫu). Làm cách nào để giải nén bản đồ này trong chế độ xem của tôi.

Tất cả những gì tôi có hiện tại là

{{ . }} 

hiển thị một cái gì đó như:

map[Pilates:[{102 PILATES ~/mobifit/video/ocen.mpg 169 40 2014-05-03 23:12:12 +0000 UTC 2014-05-03 23:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC {PILATES Pilates 1 2014-01-22 21:46:16 +0000 UTC} {1 leebrooks0@gmail.com password SUPERADMIN Lee Brooks {Male true} {1990-07-11 00:00:00 +0000 UTC true} {1.85 true} {88 true} 2014-01-22 21:46:16 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false}} [{1 Mat 2014-01-22 21:46:16 +0000 UTC}]} {70 PILATES ~/mobifit/video/ocen.mpg 119 66 2014-03-31 15:12:12 +0000 UTC 2014-03-31 15:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC 

Câu trả lời:


166

Kiểm tra phần Biến trong tài liệu mẫu Go. Một phạm vi có thể khai báo hai biến, được phân tách bằng dấu phẩy. Những điều sau đây sẽ hoạt động:

{{ range $key, $value := . }}
   <li><strong>{{ $key }}</strong>: {{ $value }}</li>
{{ end }}

46

Như Herman đã chỉ ra, bạn có thể lấy chỉ mục và phần tử từ mỗi lần lặp.

{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}

Ví dụ làm việc:

package main

import (
    "html/template"
    "os"
)

type EntetiesClass struct {
    Name string
    Value int32
}

// In the template, we use rangeStruct to turn our struct values
// into a slice we can iterate over
var htmlTemplate = `{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}`

func main() {
    data := map[string][]EntetiesClass{
        "Yoga": {{"Yoga", 15}, {"Yoga", 51}},
        "Pilates": {{"Pilates", 3}, {"Pilates", 6}, {"Pilates", 9}},
    }

    t := template.New("t")
    t, err := t.Parse(htmlTemplate)
    if err != nil {
        panic(err)
    }

    err = t.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }

}

Đầu ra:

Pilates
3
6
9

Yoga
15
51

Sân chơi: http://play.golang.org/p/4ISxcFKG7v


Xin chào @ANisus, tôi có yêu cầu tạo json thông qua một mẫu như bên dưới nhưng nó cũng có thêm dấu phẩy như trong mảng địa chỉ trong ví dụ cụ thể Đầu ra `` `{" name ":" Mus "," adresses ": [{" address ":" A "}, {" address ":" B "},]}` `Liên kết của mã ví dụ play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem Bạn có thể kiểm tra chỉ mục của mỗi lần lặp và không thêm dấu phẩy vào lần lặp đầu tiên. Xem ví dụ: play.golang.org/p/5544hc_0_g8 . Chỉ cần cẩn thận. Kết xuất JSON với các mẫu sẽ gây ra sự cố thoát. Xem địa chỉ "C&D" mà tôi đã thêm.
ANisus

cảm ơn. Tôi đã giải quyết vấn đề thoát bằng cách nhập "văn bản / mẫu" thay vì "html / mẫu". play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem Thật không may, bây giờ bạn có thể nhận được JSON không hợp lệ, hoặc thậm chí tệ hơn, JSON được đưa vào: play.golang.org/p/kd9bM_rpwyg . Sử dụng mẫu để tạo json là không khôn ngoan, nhưng nếu bạn phải làm vậy, hãy thoát các giá trị JSON bằng các hàm như js (cũng trong ví dụ này).
ANisus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.