golang http 编程-2(模版渲染)

本文介绍了Go语言中使用http和template包进行HTML模板渲染的方法,包括结构体struct渲染、if判断条件、map数据渲染以及range和with关键字的使用,通过实例代码详细展示了如何将数据与模板结合并呈现到网页上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识 template

  • template.ParseFiles(file) 进行解析文件
  • t.Execute(io.Writer, interface{}) 把数据渲染到html里面
  • 调用数据渲染 {{ }}
  • {{ . }} 里面的.代表你传入的数据(结构体,map)进行渲染
  • {{ .Name }} 是 取传入的数据中的Name的数值

传入的数据类型中的元素必须大写开头,否则访问不到该元素

main.go

package main

import (
    "fmt"
    "os"
    "text/template"
)

type Persion struct {
    Name string
    Age  int
}

func main() {

    file := "h:/360_update/oldboy_go/src/go_dev/day10/exercises/http_template/index.html"

    t, err := template.ParseFiles(file)

    if err != nil {
        fmt.Println("parse file err:", err)
        return
    }
    p := Persion{
        Name: "Conny",
        Age:  18,
    }
    if err := t.Execute(os.Stdout, p); err != nil {
        fmt.Println("There was an error:", err.Error())
    }
}

index.html

<html>
    <body>
        <p>hello {{ .Name }}</p>
        <p>Age: {{ .Age }}</p>
        <p>{{ . }}</p>
    </body>
</html>

编译并运行:

$ go build go_dev/day10/exercises/http_template
$ .\http_template.exe
<html>
    <body>
        <p>hello Conny</p>
        <p>Age: 18</p>
        <p>{Conny 18}</p>
    </body>
</html>

http template 渲染

渲染-1(结构体 struct渲染)

package main

import (
    "fmt"
    "net/http"
    "text/template"
)

type Persion struct {
    Name  string
    Age   int
    Title string
}

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {
    fmt.Println("user info...")
    fmt.Fprintln(writer, "<h1>User info</h1>")

    user := Persion{
        Name:  "Conny",
        Age:   18,
        Title: "Conny web server",
    }

        // 利用结构体渲染
    myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
    myTemplate, err = template.ParseFiles(fileName)
    if err == nil {
        err = fmt.Errorf("parse file err:%v", err)
        return
    }

    return
}

func main() {
    initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
    http.HandleFunc("/user/info", userInfo)

    err := http.ListenAndServe("0.0.0.0:8000", nil)
    if err != nil {
        fmt.Println("server failed ...")
        return
    }

}

index.html

<html>
    <head>
        <title>{{ .Title }}</title>
    </head>
    <body>
        <p>hello {{ .Name }}</p>
        <p>Age: {{ .Age }}</p>
        <p>Age: {{ . }}</p>
    </body>
</html>

编译并运行

$ go build go_dev/day10/exercises/6-http-template
$ ./6-http-template

使用http client访问(使用浏览器访问更直观)

$ ./2-http-client
data: <h1>User info</h1>
<html>
    <head>
        <title>Conny web server</title>
    </head>
    <body>
        <p>hello Conny</p>
        <p>Age: 18</p>
        <p>Age: {Conny 18 Conny web server}</p>
    </body>
</html>

template 渲染 if判断

使用方法:

{{ if gt .Age 20 }}
    <p> hello, old main {{ .Name }}</p>
{{ else }}
    <p> hello, yong main {{ .Name }}</p>
{{ end }}

if对比操作符

  • not 非 {{if not .condition}} {{end}}
  • and 与 {{if and .condition1 .condition2}} {{end}}
  • or 或 {{if or .condition1 .condition2}} {{end}}
  • eq 等于 {{if eq .var1 .var2}} {{end}}
  • ne 不等于 {{if ne .var1 .var2}} {{end}}
  • lt 小于(less than) {{if lt .var1 .var2}} {{end}}
  • le 小于等于 {{if le .var1 .var2}} {{end}}
  • gt 大于 {{if gt .var1 .var2}} {{end}}
  • ge 大于等于{{if ge .var1 .var2}} {{end}}

index.html

<html>
    <head>
        <title>{{ .Title }}</title>
    </head>
    <body>
        <p>hello {{ .Name }}</p>

        {{ if gt .Age 20 }}
            <p> hello, old man {{ .Name }}</p>
        {{ else }}
            <p> hello, yong man {{ .Name }}</p>
        {{ end }}

    </body>
</html>

http 渲染-2 (map渲染)

  • with 是在with代码块中 传入的元素变成 . 来操作
  • range 循环数组
package main

import (
    "fmt"
    "net/http"
    "text/template"
)

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {
    fmt.Println("user info...")

    // 初始化一个map
    user := make(map[string]interface{})
    user["name"] = "Conny"
    user["age"] = 18
    user["title"] = "个人网站"

    // 渲染到html中
    myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
    myTemplate, err = template.ParseFiles(fileName)
    if err == nil {
        err = fmt.Errorf("parse file err:%v", err)
        return
    }
    return
}

func main() {
    initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
    http.HandleFunc("/user/info", userInfo)

    err := http.ListenAndServe("0.0.0.0:8000", nil)
    if err != nil {
        fmt.Println("server failed ...")
        return
    }

}

index.html

<html>
    <head>
        <title>{{ .title }}</title>

    </head>
    <body>

        <p>hello {{ .name }}</p>

        {{ if gt .age 20 }}
            <p> hello, old man {{ .name }}</p>
        {{ else }}
            <p> hello, yong man {{ .name }}</p>
        {{ end }}

        <p>{{ . }}</p>

    </body>
</html>

编译运行

$ go build go_dev/day10/exercises/6-http-template
$  .\6-http-template.exe

模板渲染 range with


package main

import (
    "fmt"
    "net/http"
    "text/template"
)

type Persion struct {
    Name     string
    Age      int
    Describe string
}

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {

    fmt.Println("user info...")
    user := make(map[string]interface{})
    user["name"] = "Conny"
    user["age"] = 18
    user["title"] = "个人网站"

    friendA := Persion{Name: "friendA", Age: 18, Describe: "friendA web"}
    friendB := Persion{Name: "friendB", Age: 18, Describe: "friendB web"}
    friendC := Persion{Name: "friendC", Age: 18, Describe: "friendC web"}
    var friend []Persion

    // 定义friend切片 append 所有的结构体到切片中
    friend = append(friend, friendA, friendB, friendC)

    // 设置user 的friend key 为friend的切片
    user["friend"] = friend

    myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
    myTemplate, err = template.ParseFiles(fileName)
    if err == nil {
        err = fmt.Errorf("parse file err:%v", err)
        return
    }

    return
}

func main() {
    initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
    http.HandleFunc("/user/info", userInfo)

    err := http.ListenAndServe("0.0.0.0:8000", nil)
    if err != nil {
        fmt.Println("server failed ...")
        return
    }

}

index.html

<html>
    <head>
        <title>{{ .title }}</title>

    </head>
    <body>

        <p>hello {{ .name }}</p>

        {{ if gt .age 20 }}
            <p> hello, old main {{ .name }}</p>
        {{ else }}
            <p> hello, yong man {{ .name }}</p>
        {{ end }}

        <p> {{ .name }} 的朋友们:</p>

        {{ with .friend}}
        <table border="1">
            <tr>
                <td>姓名</td>
                <td>年龄</td>
                <td>描述</td>
            </tr>

            {{ range . }}

            <tr>
                <td>{{ .Name }}</td>
                <td>{{ .Age }}</td>
                <td>{{ .Describe }}</td>
            </tr>
            {{ end }}
        </table>
        {{ end }}

        <p>{{ . }}</p>

    </body>
</html>

编译并运行

$ go build go_dev/day10/exercises/6-http-template
$  .\6-http-template.exe

浏览器访问结果:

image

详解: withrange 他们两个是相辅相成使用

摘抄一段渲染代码

{{ with .friend}}
        <table border="1">
            <tr>
                <td>姓名</td>
                <td>年龄</td>
                <td>描述</td>
            </tr>

            {{ range . }}

            <tr>
                <td>{{ .Name }}</td>
                <td>{{ .Age }}</td>
                <td>{{ .Describe }}</td>
            </tr>
            {{ end }}
        </table>
{{ end }}

代码中with .friend.friend这个数组变成.供后面的range使用,range .每一次循环一个结构体friend出来进行渲染。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值