템플릿에서 맵을 통해 반복


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.