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.

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


文章名称:GO学习笔记-模版渲染及多种输出-创新互联
文章源于:http://hbruida.cn/article/pigss.html