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.
    
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/fzxiaomange/p/golang-template.html
Copyright © 2011-2022 走看看