0

0

Golang模板函数自定义与渲染技巧

P粉602998670

P粉602998670

发布时间:2025-09-12 11:41:01

|

308人浏览过

|

来源于php中文网

原创

自定义Golang模板函数需通过template.FuncMap注册函数,如toUpper;处理复杂数据可用管道访问嵌套字段,如.Address.City;条件判断用{{if}} {{else}} {{end}},循环用{{range}}遍历数据;为防XSS,默认自动转义HTML,可显式使用{{.UserInput | html}};结构体方法若首字母大写,可在模板中直接调用,如{{.FullName}}。

golang模板函数自定义与渲染技巧

Golang模板函数自定义与渲染技巧:简单来说,就是教你如何扩展Go模板的功能,让它能做更多的事情,以及如何更灵活地使用这些模板。

模板函数自定义与渲染技巧

如何自定义Golang模板函数?

自定义模板函数,其实就是给

template.FuncMap
添加你自己的函数。这有点像给工具箱添加新工具。你需要先定义一个Go函数,然后把它注册到
FuncMap
里,最后在模板里就可以像使用内置函数一样使用它了。

举个例子,假设你需要一个函数来把字符串转换成大写。你可以这样:

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "fmt"
    "html/template"
    "os"
    "strings"
)

// 定义一个函数,将字符串转为大写
func toUpper(s string) string {
    return strings.ToUpper(s)
}

func main() {
    // 创建一个FuncMap,并将自定义函数注册进去
    funcMap := template.FuncMap{
        "toUpper": toUpper,
    }

    // 创建一个模板,并使用FuncMap
    tmpl, err := template.New("test").Funcs(funcMap).Parse(`
        {{ .Name }} 的大写是:{{ toUpper .Name }}
    `)
    if err != nil {
        panic(err)
    }

    // 定义数据
    data := struct {
        Name string
    }{
        Name: "golang",
    }

    // 渲染模板
    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

这段代码首先定义了一个

toUpper
函数,然后创建了一个
FuncMap
,把
toUpper
函数注册到里面,键名是"toUpper"。之后,创建模板的时候,通过
.Funcs(funcMap)
FuncMap
传进去。在模板里,就可以直接使用
{{ toUpper .Name }}
来调用这个函数了。

如何在Golang模板中处理复杂数据结构?

处理复杂数据结构的关键在于理解模板的“管道”概念。管道允许你将一个表达式的结果传递给另一个函数或表达式。这有点像流水线,数据在流水线上一步步处理。

例如,假设你有一个

User
结构体,里面有一个
Address
结构体,你需要访问
Address
里面的
City
字段。你可以这样:

package main

import (
    "fmt"
    "html/template"
    "os"
)

type Address struct {
    City string
}

type User struct {
    Name    string
    Address Address
}

func main() {
    tmpl, err := template.New("test").Parse(`
        用户 {{ .Name }} 住在 {{ .Address.City }}
    `)
    if err != nil {
        panic(err)
    }

    data := User{
        Name: "张三",
        Address: Address{
            City: "北京",
        },
    }

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

这里,

.Address.City
就是通过管道访问嵌套结构体的字段。 如果数据结构更复杂,你还可以结合自定义函数来处理,比如自定义一个函数来格式化地址信息。

Golang模板中的条件判断和循环技巧

条件判断和循环是模板中常用的控制结构。Go模板使用

{{ if ... }}
,
{{ else }}
,
{{ end }}
来进行条件判断,使用
{{ range ... }}
,
{{ end }}
来进行循环。

比如,你想根据用户的年龄来显示不同的消息:

Mapify
Mapify

Mapify是由Xmind推出的AI思维导图生成工具,原名ChatMind

下载
package main

import (
    "fmt"
    "html/template"
    "os"
)

type User struct {
    Name string
    Age  int
}

func main() {
    tmpl, err := template.New("test").Parse(`
        {{ .Name }},
        {{ if gt .Age 18 }}
            你已经成年了。
        {{ else }}
            你还未成年。
        {{ end }}
    `)
    if err != nil {
        panic(err)
    }

    data := User{
        Name: "李四",
        Age:  20,
    }

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

这里,

{{ if gt .Age 18 }}
使用了内置的
gt
函数(greater than),判断年龄是否大于18。

循环的例子:

package main

import (
    "fmt"
    "html/template"
    "os"
)

func main() {
    tmpl, err := template.New("test").Parse(`
        {{ range . }}
            {{ . }}
        {{ end }}
    `)
    if err != nil {
        panic(err)
    }

    data := []string{"苹果", "香蕉", "橙子"}

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

这个例子循环遍历一个字符串切片,并输出每个元素。

如何避免Golang模板中的安全漏洞(例如XSS)?

避免XSS攻击的关键在于对用户输入进行适当的转义。Go模板默认会自动转义HTML,防止XSS攻击。但是,在某些情况下,你可能需要手动转义。

Go模板提供了几个转义函数:

  • html
    : 将字符串转义为HTML。
  • js
    : 将字符串转义为JavaScript。
  • urlquery
    : 将字符串转义为URL查询参数。

例如,如果你的模板中包含用户输入的HTML内容,你需要使用

html
函数进行转义:

package main

import (
    "fmt"
    "html/template"
    "os"
)

func main() {
    tmpl, err := template.New("test").Parse(`
        
用户输入:{{ .UserInput | html }}
`) if err != nil { panic(err) } data := struct { UserInput string }{ UserInput: "", } err = tmpl.Execute(os.Stdout, data) if err != nil { panic(err) } }

这里,

{{ .UserInput | html }}
使用了
html
函数对用户输入进行转义,防止XSS攻击。 记住,永远不要信任用户输入,并始终进行适当的转义。 此外,尽量避免在模板中直接拼接字符串,因为这可能会引入安全漏洞。

如何在Golang模板中使用自定义的结构体方法?

你可以在模板中直接调用结构体的方法,这使得模板可以更方便地处理结构体数据。 前提是方法要是导出的(首字母大写)。

package main

import (
    "fmt"
    "html/template"
    "os"
)

type User struct {
    FirstName string
    LastName  string
}

// 定义一个结构体方法,返回用户的全名
func (u User) FullName() string {
    return u.FirstName + " " + u.LastName
}

func main() {
    tmpl, err := template.New("test").Parse(`
        {{ .FullName }}
    `)
    if err != nil {
        panic(err)
    }

    data := User{
        FirstName: "张",
        LastName:  "三",
    }

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

这里,

{{ .FullName }}
直接调用了
User
结构体的
FullName
方法。 这种方式可以让你在模板中更方便地处理结构体数据,而不需要定义额外的模板函数。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

548

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

373

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

730

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

475

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

656

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号