GO语言html模板

模板

一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象。大部分的字符串只是按面值打印,但是对于actions部分将触发其它的行为。每个actions都包含了一个用模板语言书写的表达式,一个action虽然简短但是可以输出复杂的打印值,模板语言包含通过选择结构体的成员、调用函数或方法、表达式控制流if-else 语句range循环语句,还有其它实例化模板等诸多特性。Action内部不能有换行,但注释可以有换行。

示例

模板执行时会遍历结构并将指针表示为’.‘(称之为”dot”)指向运行过程中数据结构的当前位置的值。
用作模板的输入文本必须是utf-8编码的文本。
Html示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <p>Hello {{.}}!</p>
</body>
</html>

GO server端:

func sayHi(w http.ResponseWriter,r *http.Request)  {
    // 解析指定文件生成模板对象
    tem,err := template.ParseFiles("xx/hello.html")
    if err != nil{
        fmt.Println("读取文件失败,err",err)
        return
    }
    // 利用给定数据渲染模板,并将结果写入w
    tem.Execute(w,"Ares")
}
func main()  {
    http.HandleFunc("/",sayHi)
    err := http.ListenAndServe("127.0.0.1:8888",nil)
    if err != nil{
        fmt.Println("监听失败,err",err)
        return
    }
}

效果:
?

模板语法

模板语法都包含在{{和}}中间,其中{{.}}中的点表示当前对象。
当我们传入一个结构体对象时,我们可以根据.来访问结构体的对应字段。Html示例:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <p>Hello {{.Name}}!</p>
    <p>年龄 {{.Age}}!</p>
    <p>性别 {{.Male}}!</p>
</body>
</html>

GO server端:

type People struct {
    Name string
    Age int
    Male string
}
func sayHi(w http.ResponseWriter,r *http.Request)  {
    // 解析指定文件生成模板对象
    tem,err := template.ParseFiles("xx/hello.html")
    if err != nil{
        fmt.Println("读取文件失败,err",err)
        return
    }
    // 利用给定数据渲染模板,并将结果写入w
    People := People{
        Name:"Ares",
        Age:28,
        Male:"男",
    }
    tem.Execute(w,People)
}
func main()  {
    http.HandleFunc("/",sayHi)
    err := http.ListenAndServe("127.0.0.1:8888",nil)
    if err != nil{
        fmt.Println("监听失败,err",err)
        return
    }
}

效果:
?

注释

{{/* a comment */}}
可以多行。注释不能嵌套。

变量

Action里可以初始化一个变量来捕获管道的执行结果。初始化语法如下:

$variable := pipeline

示例:

<body>
    <p>Hello {{.Name}}!</p>
    <p>年龄 {{.Age}}!</p>
    <p>性别 {{.Male}}!</p>
    {{ $age := . }}
    {{ $age.Age }}
</body>

条件判断

初始语法:

{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

示例:

<body>
    <p>Hello {{.Name}}!</p>
    <p>年龄 {{.Age}}!</p>
    <p>性别 {{.Male}}!</p>
    {{ $age := . }}
    {{ $age.Age }}
    {{if gt .Age 18}}
    <div>成年啦!</div>
    {{else}}
    <div>快乐成长!</div>
    {{end}}
</body>

比较函数

布尔函数会将任何类型的零值视为假,其余视为真。

eq      如果arg1 == arg2则返回真
ne      如果arg1 != arg2则返回真
lt      如果arg1 < arg2则返回真
le      如果arg1 <= arg2则返回真
gt      如果arg1 > arg2则返回真
ge      如果arg1 >= arg2则返回真

range

使用range关键字进行遍历,有以下两种写法,其中pipeline的值必须是数组、切片、字典或者通道。
基本语法:

{{range pipeline}} T1 {{end}}
如果pipeline的值其长度为0,不会有任何输出

{{range pipeline}} T1 {{else}} T0 {{end}}
如果pipeline的值其长度为0,则会执行T0。

map示例:

PeopleMap := map[int]People{
        1: {"Ares", 18, "男"},
        2: {"龙猫", 28, "女"},
    }
tem.Execute(w, PeopleMap)

切片示例:

PeopleSlice := []People{
        {"Ares", 18, "男"},
        {"龙猫", 28, "女"},
    }
    tem.Execute(w, PeopleSlice)

HTML模板:

<body>
<table border="1">
    <thead>
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
    </tr>
    </thead>
    <tbody>
    {{range $index, $user := .}}
    <tr>
        <td>{{$index}}</td>
        <td>{{$user.Name}}</td>
        <td>{{$user.Age}}</td>
        <td>{{$user.Male}}</td>
    </tr>
    {{end}}
    </tbody>
</table>
</body>

效果:
?

预定义函数

执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。一般不在模板内定义函数,而是使用Funcs方法添加函数到模板里。

and
    函数返回它的第一个empty参数或者最后一个参数;
    就是说"and x y"等价于"if x then y else x";所有参数都会执行;
or
    返回第一个非empty参数或者最后一个参数;
    亦即"or x y"等价于"if x then x else y";所有参数都会执行;
not
    返回它的单个参数的布尔值的否定
len
    返回它的参数的整数类型长度
index
    执行结果为第一个参数以剩下的参数为索引/键指向的值;
    如"index x 1 2 3"返回x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print
    即fmt.Sprint
printf
    即fmt.Sprintf
println
    即fmt.Sprintln
html
    返回其参数文本表示的HTML逸码等价表示。
urlquery
    返回其参数文本表示的可嵌入URL查询的逸码等价表示。
js
    返回其参数文本表示的JavaScript逸码等价表示。
call
    执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函数的参数;
    如"call .X.Y 1 2"等价于go语言里的dot.X.Y(1, 2);
    其中Y是函数类型的字段或者字典的值,或者其他类似情况;
    call的第一个参数的执行结果必须是函数类型的值(和预定义函数如print明显不同);
    该函数类型值必须有1到2个返回值,如果有2个则后一个必须是error接口类型;
    如果有2个返回值的方法返回的error非nil,模板执行会中断并返回给调用模板执行者该错误;

参考:GO语言标准库
示例:

<p>{{index . 1}}</p>
    <p>切片长度: {{len .}}</p>
    <p>
        {{with index . 1}}
        {{printf "姓名:%s 年龄:%d 性别:%s" .Name .Age .Male}}
        {{end}}
    </p>

效果:
?

自定义函数

自定义一个book函数:

type Book struct {
    Name string
    Author string
    Price float32
}

func info(w http.ResponseWriter,r *http.Request)  {
    // 打开一个模板文件
    htmlByte,err := ioutil.ReadFile("./info.html")
    if err != nil{
        fmt.Println("读取html文件失败,err",err)
        return
    }
    // 1. 自定义一个函数
    // 自定义一个书籍的模板函数
    bookFunc := func(arg string) (string, error) {
        return arg + "真好看!", nil
    }
    // 2. 把自定义的函数告诉模板系统
    // template.New("info") // 创建一个Template对象
    // template.New("info").Funcs(template.FuncMap{"book": bookFunc}) // 给模板系统追加自定义函数
    // 解析模板
    t,err := template.New("info").Funcs(template.FuncMap{"book": bookFunc}).Parse(string(htmlByte))
    if err != nil{
        fmt.Println("parse html文件失败,err",err)
        return
    }
    BookMap := map[int]Book{
        1:{"跟Ares一起学GO","Ares",9.9},
        2:{"斗破苍穹","Ares1",99.9},
    }
    t.Execute(w,BookMap)
}

func main()  {
    http.HandleFunc("/info",info)
    http.ListenAndServe("127.0.0.1:8888",nil)
}

html:

<body>
    <p>
    {{with index . 1}}
    <p>{{book .Name}}</p>
    {{end}}
    </p>
    <p>
    {{with index . 2}}
    <p>{{book .Name}}</p>
    {{end}}
    </p>
</body>

效果:
?

模板嵌套

我们可以在template中嵌套其他的template。这个template可以是单独的文件,也可以是通过define定义的template.

func index(w http.ResponseWriter,r * http.Request)  {
    t , err := template.ParseFiles("./index.html","./test.html")
    if err != nil{
        fmt.Println("读取html文件失败,err",err)
        return
    }
    t.Execute(w,nil)
}
func main()  {
    http.HandleFunc("/",index)
    http.ListenAndServe("127.0.0.1:8888",nil)
}

index.html:

<body>
<h1>测试嵌套template语法</h1>
<hr>
{{template "test.html"}}
<hr>
{{/* 在index.html这个模板中调用了另外一个模板:index.html */}}
{{template "inside.html"}}
</body>
</html>

{{/* 在index.html这个模板中定义了另外一个模板:inside.html */}}
{{ define "inside.html"}}
<h1>inside.html</h1>
<ol>
    <li>吃饭</li>
    <li>睡觉</li>
    <li>打豆豆</li>
</ol>
{{end}}

test.html:

<body>
<ol>
    <li>嵌套模板</li>
    <li>out模板</li>
</ol>
</body>

效果:
?

原文地址:https://www.cnblogs.com/aresxin/p/GO-yu-yanhtml-mo-ban.html

时间: 2024-10-07 19:01:31

GO语言html模板的相关文章

Xamarin XAML语言教程模板视图TemplatedView(二)

Xamarin XAML语言教程模板视图TemplatedView(二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于中TemplatedView.代码如下: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://s

C语言 HelloWorld 模板

C语言 HelloWorld 模板 在写第一个C语言的程序前你先需要了解一些关于C语言的基础知识. 基础知识 一.注释 1.行注释 // 2.块注释 /* */ 二.头文件 1.导入库操作 // 导入库操作 include// 导入一个文件 stdio.h(std是一个标准库.i是input.o是output..h头文件.标准输入输出库) // <>表示导入系统文件. “”表示导入自定义文件 #include <stdio.h> 三.函数 1.函数 // int 数据类型.整型.如

Django中模板总结[模板语言,模板继承,CSRF攻击,反向解析]

模板 概述 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器.模版致力于表达外观,而不是程序逻辑.模板的设计实现了业务逻辑view与显示内容template的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用. 创建模板文件夹 在项目的文件里面定义一个templates文件夹 在创建的文件夹里面再创建一个文件夹为每个应用的html文件夹 起名为和应用名同名的文

Django框架(十一):模板介绍、模板语言、模板继承、HTML转义

1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页面内容.通过模板语言来产生. 1.2 模板文件的使用 通常是在视图函数中使用模板产生html内容返回给客户端. 加载模板文件loader.get_template,获取模板文件的内容,产生一个模板对象. 定义模板上下文RequeseContext,给模板文件传递数据. 模板渲染产生html页面内容r

C语言状态机模板

转载声明:如果转载本博客内容,请联系[email protected],获得作者书面授权. 前言 上一篇我的博客中探讨了一种非swtich-case结构的状态机写法,但是个人感觉写起来比较麻烦,如果增加一个状态,需要手动地在函数指针数组中添加相应的功能函数,而且状态函数的也必须写在函数指针数组前面导致代码结构较差,如果写在后面,又要在前面声明,就更麻烦了,总之,不易维护,想到Adam Dunkels在LwIP中逆天的宏定义用法,使得代码有自动更新的功能,于是也尝试着套用下其写法,现在这段代码更易

【Java模板语言】TinyTemplate 实战 &lt;一&gt;:Serlvet集成

Writer      :BYSocket(泥沙砖瓦浆木匠) 一.什么是TinyTemplate 什么是模板语言? 模板语言是为了使用户界面与业务数据(内容)分离而产生的,并能生成特定格式的文档. 什么是TinyTemplate?(开源项目地址入口) Tiny模板引擎是一个基于Java技术构建的模板引擎,它具有体量小.性能高和扩展易的特点. 适合于所有通过文本模板生成文本类型内容的场景,如:XML.源文件.HTML等等,可以说,它的出现就是为了替换Velocity模板引擎而来,因此在指令集上在尽

《开源框架那点事儿23》:Tiny模板语言(VelocityPlus)初步入门

2 Tiny模板语言概述 3 Tiny模板语言能为您做什么? 4 Tiny模板语言简介 5 Hello Tiny! 6 注释 7 引用(References) 7.1 变量(variables) 7.2 属性(properties) 7.3 方法(methods) 8 表达式(Expression) 8.1 取值表达式 8.2 Map常量 8.3 数组常量 8.4 其他表达式 9 索引表示法 10 渲染 11 与Java无缝对接 12 模板布局 13 指令集 13.1 #set指令 13.2 条

高性能跨语言模板引擎Crox

http://thx.github.io/crox/ Crox是一个由JavaScript语言实现的高性能跨语言模板引擎.Crox模板可以直接在JavaScript环境中使用,也可以翻译成PHP,JSP等其他编程语言的可执行方法或翻译成Velocity,Smarty等其他模板引擎的源模板,Crox将保证翻译后的结果具备最佳执行效率. 在生产系统中,我们使用的各种前后端模板引擎多有其独到的一面,而Crox的特点即它是面向"跨语言并高性能"这个目标设计的,Crox的设计过程是在模板提供的功

Tiny模板语言(VelocityPlus)初步入门

1 关于用户手册 本文主要介绍如何在模板中使用Tiny模板语言,通过查阅本手册,可以对Tiny模板语言 TTL(Tiny Template Language)的用法有一个较全面的认识,并学会如何有效地使用Tiny模板语言.同时,本文提供了较多的例子帮您来学习并掌握它. 2 Tiny模板语言概述 Tiny 模板语言是一个参考Velocity语法的模板语言,它对Velocity模板语言中一些功能不太完全及使用过程中比较不方便的地方进行全面的扩展和升级,同时为了更好的适应Web界面层的开发,还提供了强