1. 程式人生 > >golang基礎-模板渲染(終端、瀏覽器)、渲染輸出檔案、自定義io.Writer渲染

golang基礎-模板渲染(終端、瀏覽器)、渲染輸出檔案、自定義io.Writer渲染

模板渲染終端

1)替換 {{.欄位名}}

demo.go

package main

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

type Person struct {
    Name string
    age  string
}

func main() {
    t, err := template.ParseFiles("e:/golang/go_pro/src/safly/index.html")
    if err != nil {
        fmt.Println("parse file err:", err)
        return
    }
    p := Person{Name: "Mary"
, age: "31"} if err := t.Execute(os.Stdout, p); err != nil { fmt.Println("There was an error:", err.Error()) } }

index.html

<html>

<head>
    <title>
    </title>
</head>

<body>
    <p>
        <!--p代表當前物件-->
        hello,{{.Name}}{{.
}}
</p> </body> </html>

然後在終端就可以渲染輸出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
<html>

<head>
    <title>
    </title>
</head>

<body>
    <p>
        <!--p代表當前物件-->
        hello,Mary
        {Mary 31}
    </p>
</body
>
</html> PS E:\golang\go_pro\src\safly>

模板渲染瀏覽器輸出

index.html保持不變

package main

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

var myTemplate *template.Template

type Person struct {
    Name string
    age  string
}


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

    p := Person{Name:"safly",age:"30"}
    myTemplate.Execute(w,p)

}

func initTemplate(fileName string) (err error){
    myTemplate,err  = template.ParseFiles(fileName)
    if err != nil{
        fmt.Println("parse file err:",err)
        return
    }
    return
}
/*
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
*/

func main() {
    initTemplate("e:/golang/go_pro/src/safly/index.html")
    http.HandleFunc("/user/info", userInfo)
    err := http.ListenAndServe("0.0.0.0:8880", nil)
    if err != nil {
        fmt.Println("http listen failed")
    }
}

這裡寫圖片描述

模板渲染儲存檔案

這裡寫圖片描述

package main

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

var myTemplate *template.Template

type Person struct {
    Name string
    age  string
}


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

    p := Person{Name:"safly",age:"30"}

    myTemplate.Execute(os.Stdout,p)
    file,err := os.OpenFile("demo.dat", os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("open failed err:", err)
        return
    }
    myTemplate.Execute(file,p)
}

func initTemplate(fileName string) (err error){
    myTemplate,err  = template.ParseFiles(fileName)
    if err != nil{
        fmt.Println("parse file err:",err)
        return
    }
    return
}
/*
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
*/

func main() {
    initTemplate("e:/golang/go_pro/src/safly/index.html")
    http.HandleFunc("/user/info", userInfo)
    err := http.ListenAndServe("0.0.0.0:8880", nil)
    if err != nil {
        fmt.Println("http listen failed")
    }
}

然後demo.dat就被渲染輸出內容了:

這裡寫圖片描述

自定義io.Writer渲染

我們看下myTemplate.Execute原始碼

func (t *Template) Execute(wr io.Writer, data interface{}) error {
    if err := t.escape(); err != nil {
        return err
    }
    return t.text.Execute(wr, data)
}
type Writer interface {
    Write(p []byte) (n int, err error)
}

所以我們實現Writer介面方法Write就可以自定義了

package main

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

var myTemplate *template.Template

type Person struct {
    Name string
    age  string
}

type Result struct {
    output string
}
/*
自定義實現介面
type Writer interface {
    Write(p []byte) (n int, err error)
}
*/
func (p *Result) Write(b []byte) (n int, err error) {
    fmt.Println("called by template")
    p.output += string(b)
    return len(b), nil
}

/*
func WriteString(w Writer, s string) (n int, err error) {
    if sw, ok := w.(stringWriter); ok {
        return sw.WriteString(s)
    }
    return w.Write([]byte(s))
}
*/

func userInfo(w http.ResponseWriter,r *http.Request) {
    p := Person{Name:"safly",age:"30"}

    resultWriter := &Result{}
    io.WriteString(resultWriter, "hello world")

    myTemplate.Execute(resultWriter,p)
    fmt.Println("render data:",resultWriter.output)
}

func initTemplate(fileName string) (err error){
    myTemplate,err  = template.ParseFiles(fileName)
    if err != nil{
        fmt.Println("parse file err:",err)
        return
    }
    return
}
/*
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
*/

func main() {
    initTemplate("e:/golang/go_pro/src/safly/index.html")
    http.HandleFunc("/user/info", userInfo)
    err := http.ListenAndServe("0.0.0.0:8880", nil)
    if err != nil {
        fmt.Println("http listen failed")
    }
}
PS E:\golang\go_pro\src\safly> go run demo.go
called by template
called by template
called by template
called by template
called by template
called by template
render data: hello world<html>

<head>
    <title>
    </title>
</head>

<body>
    <p>

        hello,safly
        {safly 30}
    </p>
</body>
</html>