
离线 TA的专栏
- 打卡等级:即来则安
- 打卡总天数:15
- 打卡月天数:0
- 打卡总奖励:249
- 最近打卡:2023-08-27 07:21:35
|
目录
- 1. 基础用法
- 1.1 创建简单模板函数
- 1.2 带参数的模板函数
- 2. 高级用法
- 2.1 条件判断函数
- 2.2 格式化函数
- 2.3 切片操作函数
- 3. 实用示例
- 3.1 HTML 安全转义
- 3.2 数据过滤和转换
- 4. 最佳实践
- 总结
1. 基础用法
1.1 创建简单模板函数
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- // 创建自定义函数映射
- funcMap := template.FuncMap{
- "upper": strings.ToUpper,
- "lower": strings.ToLower,
- }
-
- // 创建模板并添加函数
- tmpl := template.New("test").Funcs(funcMap)
-
- // 解析模板内容
- tmpl, err := tmpl.Parse(`
- 原始字符串: {{.}}
- 大写: {{upper .}}
- 小写: {{lower .}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- // 执行模板
- err = tmpl.Execute(os.Stdout, "Hello, World!")
- }
复制代码 1.2 带参数的模板函数
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- funcMap := template.FuncMap{
- "add": func(a, b int) int {
- return a + b
- },
- "multiply": func(a, b int) int {
- return a * b
- },
- }
-
- tmpl := template.New("calc").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- {{add 5 3}} = 8
- {{multiply 4 6}} = 24
- `)
-
- if err != nil {
- panic(err)
- }
-
- err = tmpl.Execute(os.Stdout, nil)
- }
复制代码 2. 高级用法
2.1 条件判断函数
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- funcMap := template.FuncMap{
- "isEven": func(n int) bool {
- return n%2 == 0
- },
- "ifThenElse": func(condition bool, a, b interface{}) interface{} {
- if condition {
- return a
- }
- return b
- },
- }
-
- tmpl := template.New("conditions").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- {{range $i := .}}
- 数字 {{$i}} 是: {{if isEven $i}}偶数{{else}}奇数{{end}}
- 另一种写法: {{ifThenElse (isEven $i) "偶数" "奇数"}}
- {{end}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- numbers := []int{1, 2, 3, 4, 5}
- err = tmpl.Execute(os.Stdout, numbers)
- }
复制代码 2.2 格式化函数
- package main
- import (
- "fmt"
- "html/template"
- "os"
- "time"
- )
- func main() {
- funcMap := template.FuncMap{
- "formatDate": func(t time.Time) string {
- return t.Format("2006-01-02 15:04:05")
- },
- "formatPrice": func(price float64) string {
- return fmt.Sprintf("¥%.2f", price)
- },
- }
-
- tmpl := template.New("format").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- 当前时间: {{formatDate .Time}}
- 商品价格: {{formatPrice .Price}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- data := struct {
- Time time.Time
- Price float64
- }{
- Time: time.Now(),
- Price: 99.99,
- }
-
- err = tmpl.Execute(os.Stdout, data)
- }
复制代码 2.3 切片操作函数
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- funcMap := template.FuncMap{
- "first": func(x []interface{}) interface{} {
- if len(x) > 0 {
- return x[0]
- }
- return nil
- },
- "last": func(x []interface{}) interface{} {
- if len(x) > 0 {
- return x[len(x)-1]
- }
- return nil
- },
- "slice": func(x []interface{}, start, end int) []interface{} {
- if start < 0 {
- start = 0
- }
- if end > len(x) {
- end = len(x)
- }
- return x[start:end]
- },
- }
-
- tmpl := template.New("slice").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- 完整切片: {{.}}
- 第一个元素: {{first .}}
- 最后一个元素: {{last .}}
- 切片[1:3]: {{slice . 1 3}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- data := []interface{}{1, 2, 3, 4, 5}
- err = tmpl.Execute(os.Stdout, data)
- }
复制代码 3. 实用示例
3.1 HTML 安全转义
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- funcMap := template.FuncMap{
- "safe": func(s string) template.HTML {
- return template.HTML(s)
- },
- "safeAttr": func(s string) template.HTMLAttr {
- return template.HTMLAttr(s)
- },
- }
-
- tmpl := template.New("safe").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- 普通文本: {{.Text}}
- HTML内容: {{safe .HTML}}
- 属性值: <div {{safeAttr .Attr}}></div>
- `)
-
- if err != nil {
- panic(err)
- }
-
- data := struct {
- Text string
- HTML string
- Attr string
- }{
- Text: "<b>文本</b>",
- HTML: "<b>HTML</b>",
- Attr: `style="color: red"`,
- }
-
- err = tmpl.Execute(os.Stdout, data)
- }
复制代码 3.2 数据过滤和转换
- package main
- import (
- "html/template"
- "os"
- "strings"
- )
- func main() {
- funcMap := template.FuncMap{
- "join": strings.Join,
- "split": strings.Split,
- "title": strings.Title,
- "filter": func(arr []string, f func(string) bool) []string {
- var result []string
- for _, v := range arr {
- if f(v) {
- result = append(result, v)
- }
- }
- return result
- },
- }
-
- tmpl := template.New("filter").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- 原始数组: {{.}}
- Join结果: {{join . ","}}
- Split结果: {{split "a,b,c" ","}}
- Title结果: {{title "hello world"}}
- Filter结果: {{filter . (lambda "len" "gt" 3)}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- data := []string{"apple", "banana", "orange", "pear"}
- err = tmpl.Execute(os.Stdout, data)
- }
复制代码 4. 最佳实践
4.1 模板函数组织
- // template_funcs.go
- package template
- import "html/template"
- // 创建全局函数映射
- var GlobalFuncMap = template.FuncMap{
- // 字符串操作
- "upper": strings.ToUpper,
- "lower": strings.ToLower,
- "title": strings.Title,
-
- // 数值操作
- "add": func(a, b int) int { return a + b },
- "subtract": func(a, b int) int { return a - b },
- "multiply": func(a, b int) int { return a * b },
- "divide": func(a, b int) float64 { return float64(a) / float64(b) },
-
- // 日期操作
- "formatDate": func(t time.Time, layout string) string { return t.Format(layout) },
- "now": time.Now,
-
- // 切片操作
- "first": first,
- "last": last,
- "slice": slice,
-
- // 条件操作
- "isEven": isEven,
- "ifThenElse": ifThenElse,
- }
- // 在应用中使用
- func main() {
- tmpl := template.New("page").Funcs(GlobalFuncMap)
- // ... 其他操作
- }
复制代码 4.2 错误处理
- package main
- import (
- "html/template"
- "os"
- )
- func main() {
- funcMap := template.FuncMap{
- "divide": func(a, b int) (string, error) {
- if b == 0 {
- return "", fmt.Errorf("除数不能为零")
- }
- return fmt.Sprintf("%.2f", float64(a)/float64(b)), nil
- },
- }
-
- tmpl := template.New("error").Funcs(funcMap)
- tmpl, err := tmpl.Parse(`
- {{with $result := divide 10 2}}
- 结果: {{$result}}
- {{else}}
- 计算出错
- {{end}}
- `)
-
- if err != nil {
- panic(err)
- }
-
- err = tmpl.Execute(os.Stdout, nil)
- }
复制代码 总结
1.基本原则
- 保持函数简单明确
- 注意类型安全
- 适当处理错误
- 避免过度复杂的逻辑
2.常见用途
- 文本格式化
- 数据转换
- 条件判断
- 集合操作
- HTML 安全处理
3.性能考虑
到此这篇关于Golang Template实现自定义函数的操作指南的文章就介绍到这了,更多相关Go Template自定义函数内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|