天天看點

GO學習筆記 - 模版渲染及多種輸出目錄定義結構體定義模版文本模版渲染及輸出方式完整例子

GO學習筆記 - 模版渲染及多種輸出目錄定義結構體定義模版文本模版渲染及輸出方式完整例子

本文主題:基于内置的text/template實作Golang模版渲染,并将結果寫入檔案、螢幕、變量。

小慢哥的原創文章,歡迎轉載

目錄

▪ 定義結構體

▪ 定義模版文本

▪ 模版渲染及輸出方式

▪ 完整例子

定義結構體

首先,定義一個結構體,用于後面的模版渲染

type Person struct {
    Name string
    Age int
    Boy bool
}           

注意:struct的元素必須要可導出(大寫打頭),否則渲染時候找不到

執行個體化結構體,用于模版渲染時候獲得對應值

foo := Person{
    Name: "foo",
    Age: 18,
    Boy: false,
}           

定義模版文本

接下來,定義一個模版文本,此處直接定義了一個常量,表示模版文本

const text = `My name is {{.Name}},
I'm {{.Age}} years old,
I'm a {{if .Boy}}boy{{else}}girl{{end}}.
`           

讀取文本,擷取template的handler

tmpl, err := template.New("").Parse(text)
if err != nil {
    log.Fatalln(err)
}           

模版渲染及輸出方式

在渲染時候需要傳遞一個參數,用于指定輸出到何處,常見的有3種目的地:

▷ 輸出到檔案

▷ 輸出到變量

▷ 輸出到螢幕

輸出到檔案:需要先open一個檔案并獲得檔案句柄

f, err := os.OpenFile("/tmp/test", os.O_WRONLY|os.O_CREATE, 0644)
defer f.Close()
if err != nil {
    log.Fatalln(err)
}

// 渲染并寫入檔案
if err := tmpl.Execute(f, foo); err != nil {
    log.Fatalln(err)
}           

輸出到變量

var buf bytes.Buffer

if err := tmpl.Execute(&buf, foo); err != nil {
    log.Fatalln(err)
}
fmt.Println(buf.String())           

輸出到螢幕

if err := tmpl.Execute(os.Stdout, foo); err != nil {
    log.Fatalln(err)
}           

完整例子

package main

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

type Person struct {
    Name string
    Age int
    Boy bool
}

func main() {
    // 執行個體化結構體
    foo := Person{
        Name: "foo",
        Age: 18,
        Boy: false,
    }

    // 定義模版文本
    const text = `My name is {{.Name}},
I'm {{.Age}} years old,
I'm a {{if .Boy}}boy{{else}}girl{{end}}.
`

    // 根據指定模版文本生成handler
    tmpl, err := template.New("").Parse(text)
    if err != nil {
        log.Fatalln(err)
    }

    // 模版渲染,并寫入檔案
    f, err := os.OpenFile("/tmp/test", os.O_WRONLY|os.O_CREATE, 0644)
    defer f.Close()
    if err != nil {
        log.Fatalln(err)
    }
    if err := tmpl.Execute(f, foo); err != nil {
        log.Fatalln(err)
    }

    // 模版渲染,并指派給變量
    var buf bytes.Buffer
    if err := tmpl.Execute(&buf, foo); err != nil {
        log.Fatalln(err)
    }
    fmt.Println(buf.String())

    // 模版渲染,并輸出到螢幕标準輸出
    if err := tmpl.Execute(os.Stdout, foo); err != nil {
        log.Fatalln(err)
    }
}           

測試效果

# 編譯
go build template.go
./template

# 輸出
My name is foo,
I'm 18 years old,
I'm a girl.

My name is foo,
I'm 18 years old,
I'm a girl.

# 檢視檔案(/tmp/test)内容
My name is foo,
I'm 18 years old,
I'm a girl.