duanjuebiao6730 2016-10-29 23:15
浏览 40
已采纳

Go模板:两个或多个切片范围

The next code works perfect for output one slice inside the HomeTemplate.

main.go

type Item struct {
    Id          int
    Name string
    Type      string
}

var tmpl = template.Must(template.ParseGlob("tmpl/*"))

func Index(w http.ResponseWriter, r *http.Request) {

    db := database.DbConn()

    selDB, err := product.ByID()
    if err != nil {
        panic(err.Error())
    }

    i := Item{}

    resItems := []Item{}

    for selDB.Next() {

        var id int
        var product_name, product_type string

        err = selDB.Scan(&id, &product_name, &product_type)
        if err != nil {
            panic(err.Error())
        }

        i.Id = id
        i.Name = product_name
        i.Type = product_type

        resItems = append(resItems, i)

    }

    tmpl.ExecuteTemplate(w, "HomeTemplate", resItems)

    // Close database connection
    defer db.Close()
}

In the template forks fine the next code:

{{ range . }}
    {{ .Name }}<br />
{{ end }}

Why something like this does not work?

{{ range .resItems }}
    {{ .Name }}<br />
{{ end }}

What if I want output two or more slices, what I need to do or change?

Thank you

  • 写回答

1条回答 默认 最新

  • down123321123 2016-10-30 06:41
    关注

    first question, why rang .resItems doesn't work.
    In template, . means current item. like this in java. if . in some direction like range, it means the item from range operation.
    if not, it means the item you passed form ExecuteTemplate() method. like in ExecuteTemplate(w, "HomeTemplate", resItems), . means resItems. so you can not use .resItems because it means resItems have a value called resItems.

    second, if you have more slices to pass to template, you can add all of them to a map, like this:

    t := template.New("test")
    t, _ = t.Parse(`
    test range 
    {{range .first}} {{.}} {{end}}
    {{range .second}} {{.}} {{end}}
    `)
    var res = make(map[string]interface{})
    aa := []string{"first", "second"}
    bb := []string{"123", "456"}
    res["first"] = aa
    res["second"] = bb
    t.Execute(os.Stdout, res)
    
    // output
    test range
     first  second
     123  456
    

    I have two array aa and bb, and add them to a map then pass it to the template. In template, . means the map, and .first got the array aa. and so as bb.

    Hope this can help you...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?