템플릿에서 맵을 통해 반복


94

체육관 수업 목록 (요가, 필라테스 등)을 표시하려고합니다. 각 수업 유형에 대해 여러 수업이 있으므로 모든 요가 수업과 모든 필라테스 수업 등을 그룹화하고 싶습니다.

슬라이스를 가져와지도를 만드는 기능을 만들었습니다.

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
}

문제는 이제 http://golang.org/pkg/text/template/ 에 따라 어떻게 반복 할 수 있는지 입니다. .Key형식 으로 액세스해야 합니다. 키를 모릅니다. 템플릿에 키 수). 내보기에서이지도의 압축을 풀려면 어떻게해야합니까?

내가 현재 가지고있는 것은

{{ . }} 

다음과 같이 표시됩니다.

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 

답변:


169

Go 템플릿 문서 의 변수 섹션 을 확인하세요 . 범위는 쉼표로 구분 된 두 개의 변수를 선언 할 수 있습니다. 다음이 작동합니다.

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

47

Herman이 지적했듯이 각 반복에서 인덱스와 요소를 얻을 수 있습니다.

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

작업 예 :

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)
    }

}

산출:

Pilates
3
6
9

Yoga
15
51

플레이 그라운드 : http://play.golang.org/p/4ISxcFKG7v


안녕하세요 @ANisus, 저는 아래와 같은 템플릿을 통해 json을 생성해야한다는 요구 사항이 있지만 주어진 예제의 주소 배열과 같은 추가 쉼표도 있습니다. Output```{ "name": "Mus", "adresses": [{ "address ":"A "}, {"address ":"B "},]}```예제 코드 링크 play.golang.org/p/nD08y0noPHv
Mohammad Mustaqeem

1
@MohammadMustaqeem 첫 번째 반복에서 쉼표를 추가하지 않고 각 반복의 색인을 확인할 수 있습니다. 예 : play.golang.org/p/5544hc_0_g8을 참조 하세요 . 조심해. 템플릿으로 JSON을 렌더링하면 이스케이프 문제가 발생합니다. 내가 추가 한 "C & D"주소를 참조하십시오.
ANisus

감사. "html / template"대신 "text / template"을 가져 와서 이스케이프 문제를 해결했습니다. play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem 불행히도 이제 유효하지 않은 JSON을 얻거나 더 나쁜 JSON을 주입 할 수 있습니다 : play.golang.org/p/kd9bM_rpwyg . json을 생성하기 위해 템플릿을 사용하는 것은 현명하지 않지만 필요한 경우 js와 같은 함수로 JSON 값을 이스케이프합니다 (이 예에서도).
ANisus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.