设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间12 现在时间12 缓存数据 愿你迷路一生最后还是走到我身旁?

愿你迷路一生最后还是走到我身旁? -- 10.青涩

查看: 221|回复: 2

Golang Template实现自定义函数的操作指南

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:249
  • 最近打卡:2023-08-27 07:21:35
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
25
主题
25
精华
0
金钱
340
积分
62
注册时间
2023-8-13
最后登录
2025-3-15

发表于 2025-2-8 20:42:24 | 显示全部楼层 |阅读模式
目录


  • 1. 基础用法

    • 1.1 创建简单模板函数
    • 1.2 带参数的模板函数

  • 2. 高级用法

    • 2.1 条件判断函数
    • 2.2 格式化函数
    • 2.3 切片操作函数

  • 3. 实用示例

    • 3.1 HTML 安全转义
    • 3.2 数据过滤和转换

  • 4. 最佳实践

    • 4.1 模板函数组织
    • 4.2 错误处理

  • 总结

1. 基础用法


1.1 创建简单模板函数
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     // 创建自定义函数映射
  8.     funcMap := template.FuncMap{
  9.         "upper": strings.ToUpper,
  10.         "lower": strings.ToLower,
  11.     }
  12.    
  13.     // 创建模板并添加函数
  14.     tmpl := template.New("test").Funcs(funcMap)
  15.    
  16.     // 解析模板内容
  17.     tmpl, err := tmpl.Parse(`
  18.         原始字符串: {{.}}
  19.         大写: {{upper .}}
  20.         小写: {{lower .}}
  21.     `)
  22.    
  23.     if err != nil {
  24.         panic(err)
  25.     }
  26.    
  27.     // 执行模板
  28.     err = tmpl.Execute(os.Stdout, "Hello, World!")
  29. }
复制代码
1.2 带参数的模板函数
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     funcMap := template.FuncMap{
  8.         "add": func(a, b int) int {
  9.             return a + b
  10.         },
  11.         "multiply": func(a, b int) int {
  12.             return a * b
  13.         },
  14.     }
  15.    
  16.     tmpl := template.New("calc").Funcs(funcMap)
  17.     tmpl, err := tmpl.Parse(`
  18.         {{add 5 3}} = 8
  19.         {{multiply 4 6}} = 24
  20.     `)
  21.    
  22.     if err != nil {
  23.         panic(err)
  24.     }
  25.    
  26.     err = tmpl.Execute(os.Stdout, nil)
  27. }
复制代码
2. 高级用法


2.1 条件判断函数
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     funcMap := template.FuncMap{
  8.         "isEven": func(n int) bool {
  9.             return n%2 == 0
  10.         },
  11.         "ifThenElse": func(condition bool, a, b interface{}) interface{} {
  12.             if condition {
  13.                 return a
  14.             }
  15.             return b
  16.         },
  17.     }
  18.    
  19.     tmpl := template.New("conditions").Funcs(funcMap)
  20.     tmpl, err := tmpl.Parse(`
  21.         {{range $i := .}}
  22.             数字 {{$i}} 是: {{if isEven $i}}偶数{{else}}奇数{{end}}
  23.             另一种写法: {{ifThenElse (isEven $i) "偶数" "奇数"}}
  24.         {{end}}
  25.     `)
  26.    
  27.     if err != nil {
  28.         panic(err)
  29.     }
  30.    
  31.     numbers := []int{1, 2, 3, 4, 5}
  32.     err = tmpl.Execute(os.Stdout, numbers)
  33. }
复制代码
2.2 格式化函数
  1. package main

  2. import (
  3.     "fmt"
  4.     "html/template"
  5.     "os"
  6.     "time"
  7. )

  8. func main() {
  9.     funcMap := template.FuncMap{
  10.         "formatDate": func(t time.Time) string {
  11.             return t.Format("2006-01-02 15:04:05")
  12.         },
  13.         "formatPrice": func(price float64) string {
  14.             return fmt.Sprintf("¥%.2f", price)
  15.         },
  16.     }
  17.    
  18.     tmpl := template.New("format").Funcs(funcMap)
  19.     tmpl, err := tmpl.Parse(`
  20.         当前时间: {{formatDate .Time}}
  21.         商品价格: {{formatPrice .Price}}
  22.     `)
  23.    
  24.     if err != nil {
  25.         panic(err)
  26.     }
  27.    
  28.     data := struct {
  29.         Time  time.Time
  30.         Price float64
  31.     }{
  32.         Time:  time.Now(),
  33.         Price: 99.99,
  34.     }
  35.    
  36.     err = tmpl.Execute(os.Stdout, data)
  37. }
复制代码
2.3 切片操作函数
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     funcMap := template.FuncMap{
  8.         "first": func(x []interface{}) interface{} {
  9.             if len(x) > 0 {
  10.                 return x[0]
  11.             }
  12.             return nil
  13.         },
  14.         "last": func(x []interface{}) interface{} {
  15.             if len(x) > 0 {
  16.                 return x[len(x)-1]
  17.             }
  18.             return nil
  19.         },
  20.         "slice": func(x []interface{}, start, end int) []interface{} {
  21.             if start < 0 {
  22.                 start = 0
  23.             }
  24.             if end > len(x) {
  25.                 end = len(x)
  26.             }
  27.             return x[start:end]
  28.         },
  29.     }
  30.    
  31.     tmpl := template.New("slice").Funcs(funcMap)
  32.     tmpl, err := tmpl.Parse(`
  33.         完整切片: {{.}}
  34.         第一个元素: {{first .}}
  35.         最后一个元素: {{last .}}
  36.         切片[1:3]: {{slice . 1 3}}
  37.     `)
  38.    
  39.     if err != nil {
  40.         panic(err)
  41.     }
  42.    
  43.     data := []interface{}{1, 2, 3, 4, 5}
  44.     err = tmpl.Execute(os.Stdout, data)
  45. }
复制代码
3. 实用示例


3.1 HTML 安全转义
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     funcMap := template.FuncMap{
  8.         "safe": func(s string) template.HTML {
  9.             return template.HTML(s)
  10.         },
  11.         "safeAttr": func(s string) template.HTMLAttr {
  12.             return template.HTMLAttr(s)
  13.         },
  14.     }
  15.    
  16.     tmpl := template.New("safe").Funcs(funcMap)
  17.     tmpl, err := tmpl.Parse(`
  18.         普通文本: {{.Text}}
  19.         HTML内容: {{safe .HTML}}
  20.         属性值: <div {{safeAttr .Attr}}></div>
  21.     `)
  22.    
  23.     if err != nil {
  24.         panic(err)
  25.     }
  26.    
  27.     data := struct {
  28.         Text string
  29.         HTML string
  30.         Attr string
  31.     }{
  32.         Text: "<b>文本</b>",
  33.         HTML: "<b>HTML</b>",
  34.         Attr: `style="color: red"`,
  35.     }
  36.    
  37.     err = tmpl.Execute(os.Stdout, data)
  38. }
复制代码
3.2 数据过滤和转换
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5.     "strings"
  6. )

  7. func main() {
  8.     funcMap := template.FuncMap{
  9.         "join": strings.Join,
  10.         "split": strings.Split,
  11.         "title": strings.Title,
  12.         "filter": func(arr []string, f func(string) bool) []string {
  13.             var result []string
  14.             for _, v := range arr {
  15.                 if f(v) {
  16.                     result = append(result, v)
  17.                 }
  18.             }
  19.             return result
  20.         },
  21.     }
  22.    
  23.     tmpl := template.New("filter").Funcs(funcMap)
  24.     tmpl, err := tmpl.Parse(`
  25.         原始数组: {{.}}
  26.         Join结果: {{join . ","}}
  27.         Split结果: {{split "a,b,c" ","}}
  28.         Title结果: {{title "hello world"}}
  29.         Filter结果: {{filter . (lambda "len" "gt" 3)}}
  30.     `)
  31.    
  32.     if err != nil {
  33.         panic(err)
  34.     }
  35.    
  36.     data := []string{"apple", "banana", "orange", "pear"}
  37.     err = tmpl.Execute(os.Stdout, data)
  38. }
复制代码
4. 最佳实践


4.1 模板函数组织
  1. // template_funcs.go
  2. package template

  3. import "html/template"

  4. // 创建全局函数映射
  5. var GlobalFuncMap = template.FuncMap{
  6.     // 字符串操作
  7.     "upper":      strings.ToUpper,
  8.     "lower":      strings.ToLower,
  9.     "title":      strings.Title,
  10.    
  11.     // 数值操作
  12.     "add":        func(a, b int) int { return a + b },
  13.     "subtract":   func(a, b int) int { return a - b },
  14.     "multiply":   func(a, b int) int { return a * b },
  15.     "divide":     func(a, b int) float64 { return float64(a) / float64(b) },
  16.    
  17.     // 日期操作
  18.     "formatDate": func(t time.Time, layout string) string { return t.Format(layout) },
  19.     "now":        time.Now,
  20.    
  21.     // 切片操作
  22.     "first":      first,
  23.     "last":       last,
  24.     "slice":      slice,
  25.    
  26.     // 条件操作
  27.     "isEven":     isEven,
  28.     "ifThenElse": ifThenElse,
  29. }

  30. // 在应用中使用
  31. func main() {
  32.     tmpl := template.New("page").Funcs(GlobalFuncMap)
  33.     // ... 其他操作
  34. }
复制代码
4.2 错误处理
  1. package main

  2. import (
  3.     "html/template"
  4.     "os"
  5. )

  6. func main() {
  7.     funcMap := template.FuncMap{
  8.         "divide": func(a, b int) (string, error) {
  9.             if b == 0 {
  10.                 return "", fmt.Errorf("除数不能为零")
  11.             }
  12.             return fmt.Sprintf("%.2f", float64(a)/float64(b)), nil
  13.         },
  14.     }
  15.    
  16.     tmpl := template.New("error").Funcs(funcMap)
  17.     tmpl, err := tmpl.Parse(`
  18.         {{with $result := divide 10 2}}
  19.             结果: {{$result}}
  20.         {{else}}
  21.             计算出错
  22.         {{end}}
  23.     `)
  24.    
  25.     if err != nil {
  26.         panic(err)
  27.     }
  28.    
  29.     err = tmpl.Execute(os.Stdout, nil)
  30. }
复制代码
总结

1.基本原则

  • 保持函数简单明确
  • 注意类型安全
  • 适当处理错误
  • 避免过度复杂的逻辑
2.常见用途

  • 文本格式化
  • 数据转换
  • 条件判断
  • 集合操作
  • HTML 安全处理
3.性能考虑

  • 缓存模板
  • 避免重复解析
  • 合理使用内存
到此这篇关于Golang Template实现自定义函数的操作指南的文章就介绍到这了,更多相关Go Template自定义函数内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:20
  • 最近打卡:2025-01-03 12:26:55
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
32
积分
4
注册时间
2023-11-5
最后登录
2025-1-3

发表于 2025-2-18 20:14:32 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-3-28 12:26:52 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表