老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

跟老男孩学GO语言之模板渲染

老男孩IT教育

常见问题

2021年6月15日 17:40

template包(html/template)实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。

  template包(html/template)实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。

func New(name string) *Template

  创建一个名为name的模板。

func (t *Template) Parse(src string) (*Template, error)

  Parse方法将字符串text解析为模板。嵌套定义的模板会关联到最顶层的t。

  Parse可以多次调用,但只有第一次调用可以包含空格、注释和模板定义之外的文本。如果后面的调用在解析后仍剩余文本会引发错误、返回nil且丢弃剩余文本;如果解析得到的模板已有相关联的同名模板,会覆盖掉原模板。

func (t *Template) Execute(wr io.Writer, data interface{}) error

  Execute方法将解析好的模板应用到data上,并将输出写入wr。如果执行时出现错误,会停止执行,但有可能已经写入wr部分数据。模板可以安全的并发执行。

func ParseFiles(filenames ...string) (*Template, error)

  ParseFiles函数创建一个模板并解析filenames指定的文件里的模板定义。返回的模板的名字是第一个文件的文件名(不含扩展名),内容为解析后的第一个文件的内容。至少要提供一个文件。如果发生错误,会停止解析并返回nil。

  渲染终端

  模板渲染终端

  模板替换 {{.字段名}}

package main

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

type Oldboy struct {
    Name   string
    Slogan string
}

func main() {
    // 声明模板内容
    const tpl = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
        <p>Name:{{.Name}}</p>
        <p>Slogan:{{.Slogan}}</p>
    </body>
</html>`

    // 创建一个新的模板,并且载入内容
    t, err := template.New("oldboy").Parse(tpl)
    if err != nil {
        fmt.Println(err)
    }
    data := Oldboy{
        Name:   "oldboy",
        Slogan: "老男孩IT教育,只培养技术精英。",
    }
    err = t.Execute(os.Stdout, data)
    if err != nil {
        fmt.Println(err)
    }
}

  渲染存储文件

  模板渲染存储文件

package main

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

type Oldboy struct {
    Name   string
    Slogan string
}

// 声明模板内容
const tpl = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
        <p>Name:{{.Name}}</p>
        <p>Slogan:{{.Slogan}}</p>
    </body>
</html>`

func main() {
    // 创建一个新的模板,并且载入内容
    t, err := template.New("oldboy").Parse(tpl)
    if err != nil {
        fmt.Println(err)
    }
    data := Oldboy{
        Name:   "oldboy",
        Slogan: "老男孩IT教育,只培养技术精英。",
    }

    file, err := os.OpenFile("./oldboy.dat", os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("open failed err:", err)
        return
    }
    err = t.Execute(file, data)
    if err != nil {
        fmt.Println(err)
    }
}

  渲染浏览器

  目录结构:

    oldboy
      |
       —— oldboy.go
      |
       —— oldboy.html

  oldboy.html 代码如下:

<html>
    <head>
        <title>oldboy</title>
    </head>

    <body>
        <p>Name:{{.Name}}</p>
        <p>Slogan:{{.Slogan}}</p>
    </body>
</html>

  oldboy.go 代码如下:

package main

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

type Oldboy struct {
    Name   string
    Slogan string
}

func main() {
    http.HandleFunc("/oldboy", oldboy)
    err := http.ListenAndServe("0.0.0.0:8888", nil)
    if err != nil {
        fmt.Println("http listen failed")
    }
}

func oldboy(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("./oldboy.html")
    if err != nil {
        fmt.Println("parse file err:", err)
        return
    }
    data := Oldboy{
        Name:   "oldboy",
        Slogan: "老男孩IT教育,只培养技术精英。",
    }
    t.Execute(w, data)
}

  编译运行,然后在浏览器中输入 :

  http://localhost:8888/oldboy

  页面显示:

Name:oldboy

Slogan:老男孩IT教育,只培养技术精英。

  form表单提交

package main

import (
    "io"
    // "log"
    "net/http"
)

const form = `<html><body><form action="#" method="post" name="bar">
                    <input type="text" name="in"/>
                    <input type="text" name="in"/>
                     <input type="submit" value="Submit"/>
             </form></body></html>`


func FormServer(w http.ResponseWriter, request *http.Request) {
    w.Header().Set("Content-Type", "text/html")
    switch request.Method {
    case "GET":
        io.WriteString(w, form)
    case "POST":
        request.ParseForm()
        io.WriteString(w, request.Form["in"][1])
        io.WriteString(w, "\n")
        io.WriteString(w, request.FormValue("in"))
    }
}

/*
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
*/
func main() {
    http.HandleFunc("/test2", FormServer)
    if err := http.ListenAndServe(":8088", nil); err != nil {
    }
}

  然后在浏览器中输入 :

  http://localhost:8088/test2

  页面显示:

  两个输入框

  第一个输入框输入:123

  第二个输入框输入:456

  提交表单

  页面显示:

  456 123

  老男孩GO语言课程需要学什么?老男孩教育GO语言课程专为在职人员设计,内容丰富、紧凑,贴近企业实战,学完后即可拥有多年实战经验,真正满足企业用人需求。

  推荐阅读:

  Python数组和列表的区别?Python教程

  Linux运维工程师的前景怎么样?Linux运维

  Python三大主流框架对比!Python学习教程

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。