Golang模板中如何传递多个参数

Golang模板中如何传递多个参数 我是Go语言的新手,正在开发一个示例Web应用来熟悉这门语言。我需要向模板传递多个值。以下是运行良好的代码,我在模板中显示了标签数据。目前我向模板传递了"labels",但还需要传递一个cookie值。谢谢

func createLabels(w http.ResponseWriter, req *http.Request) {

	rows, err := db.Query("SELECT * FROM labelTypes")

	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	labels := make([]*Label, 0)
	for rows.Next() {
		lb := new(Label)
		err := rows.Scan(&lb.Id, &lb.Name)
		if err != nil {
			log.Fatal(err)
		}
		labels = append(labels, lb)
	}

	if err = rows.Err(); err != nil {
		log.Fatal(err)
	}


	tpl.ExecuteTemplate(w, "labels.html", labels)

}

更多关于Golang模板中如何传递多个参数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

太好了。谢谢。

更多关于Golang模板中如何传递多个参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你能告诉我这个结构体应该是什么样子的吗?

使用结构体,并在其字段中填充数据。

使用匿名结构体。只需声明并填充一次。请记住结构体中的所有字段必须大写,这样它们才能被导出并在模板内部可见。

data := struct {
		Labels []Label
		Cookie http.Cookie
	}{
		Labels: labels,
		Cookie: c,
	}

然后将数据传递给 ExecuteTemplate。在模板中,您可以通过 .Cookie 访问 cookie,通过 .Labels 访问标签。

在Go语言中,向模板传递多个参数有几种常见方法。以下是两种最常用的解决方案:

方法1:使用map[string]interface{}

func createLabels(w http.ResponseWriter, req *http.Request) {
    // 获取cookie值
    cookie, err := req.Cookie("session")
    var cookieValue string
    if err == nil {
        cookieValue = cookie.Value
    }

    rows, err := db.Query("SELECT * FROM labelTypes")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    labels := make([]*Label, 0)
    for rows.Next() {
        lb := new(Label)
        err := rows.Scan(&lb.Id, &lb.Name)
        if err != nil {
            log.Fatal(err)
        }
        labels = append(labels, lb)
    }

    if err = rows.Err(); err != nil {
        log.Fatal(err)
    }

    // 创建包含多个参数的数据结构
    data := map[string]interface{}{
        "Labels": labels,
        "Cookie": cookieValue,
    }

    tpl.ExecuteTemplate(w, "labels.html", data)
}

在模板中这样使用:

<!-- labels.html -->
<div>
    <h1>Labels</h1>
    <p>Cookie Value: {{.Cookie}}</p>
    <ul>
        {{range .Labels}}
        <li>{{.Id}}: {{.Name}}</li>
        {{end}}
    </ul>
</div>

方法2:使用自定义结构体

type TemplateData struct {
    Labels []*Label
    Cookie string
}

func createLabels(w http.ResponseWriter, req *http.Request) {
    // 获取cookie值
    cookie, err := req.Cookie("session")
    var cookieValue string
    if err == nil {
        cookieValue = cookie.Value
    }

    rows, err := db.Query("SELECT * FROM labelTypes")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    labels := make([]*Label, 0)
    for rows.Next() {
        lb := new(Label)
        err := rows.Scan(&lb.Id, &lb.Name)
        if err != nil {
            log.Fatal(err)
        }
        labels = append(labels, lb)
    }

    if err = rows.Err(); err != nil {
        log.Fatal(err)
    }

    // 使用结构体传递数据
    data := TemplateData{
        Labels: labels,
        Cookie: cookieValue,
    }

    tpl.ExecuteTemplate(w, "labels.html", data)
}

模板使用方式与方法1相同。结构体方法在类型安全性和代码可维护性方面更优,特别是当需要传递多个相关参数时。

回到顶部