zoukankan      html  css  js  c++  java
  • 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.
    
  • 相关阅读:
    二维线性表 list实现
    行测题
    邻接表
    链表中插入和删除结点
    linux监控指标和命令
    lr测试结果分析
    python 装饰器 decorator
    并查集 PID331 / 家族
    素数环 dfs+回溯
    catch the cow bfs
  • 原文地址:https://www.cnblogs.com/fzxiaomange/p/golang-template.html
Copyright © 2011-2022 走看看