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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM