欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

GO学习笔记 - 模版渲染及多种输出

程序员文章站 2022-12-21 11:52:33
本文主题:基于内置的text/template实现Golang模版渲染,并将结果写入文件、屏幕、变量。 ......

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.