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

 更新时间:2025年02月07日 09:33:43   作者:老大白菜  
这篇文章主要为大家详细介绍了Golang如何利用Template实现自定义函数的操作,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下

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自定义函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Go语言实现一个简单的词频分析系统

    使用Go语言实现一个简单的词频分析系统

    在数据分析和文本挖掘中,词频统计(Word Frequency Analysis) 是最基础也是最常用的技术之一,本文将带你用 Go 语言实现一个简易的 词频分析系统,感兴趣的小伙伴可以了解下
    2025-09-09
  • 一文带你掌握GoLang中的指针

    一文带你掌握GoLang中的指针

    针是 Go 编程语言的重要组成部分,它们提供了一种直接引用和操作内存中数据的方法,在这篇文章中,我们将探讨一些技巧和技巧,以掌握 GoLang 中的指针并编写高效的代码,需要的可以参考一下
    2023-05-05
  • Go语言学习之WaitGroup用法详解

    Go语言学习之WaitGroup用法详解

    Go语言中的 WaitGroup 和 Java 中的 CyclicBarrier、CountDownLatch 非常类似。本文将详细为大家讲讲WaitGroup的用法,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • Go语言中最便捷的http请求包resty的使用详解

    Go语言中最便捷的http请求包resty的使用详解

    go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学习一下resty的具体使用吧
    2025-03-03
  • Go中标准库fmt包的使用小结

    Go中标准库fmt包的使用小结

    fmt包是Go语言处理输入输出的核心库,提供Print/Scan系列函数及多样格式化动词(如%v、%d、%s等),支持字符串格式化、扫描、自定义输出格式及错误处理,广泛用于数据格式化与输出控制,下面就来详细的介绍一下
    2025-09-09
  • GoLang职责链模式代码实现介绍

    GoLang职责链模式代码实现介绍

    这篇文章主要介绍了GoLang职责链模式代码实现,职责链模式是一种常用的设计模式,可以提高代码的灵活性与可维护性,职责链模式将请求和处理分离,可以让请求在处理链中依次经过多个处理者,直到找到能够处理请求的处理者为止
    2023-05-05
  • Golang 中的 条件变量(sync.Cond)详解

    Golang 中的 条件变量(sync.Cond)详解

    这篇文章主要介绍了Golang 中的 条件变量(sync.Cond)详解的相关资料,需要的朋友可以参考下
    2022-12-12
  • Go语言自定义linter静态检查工具

    Go语言自定义linter静态检查工具

    这篇文章主要介绍了Go语言自定义linter静态检查工具,Go语言是一门编译型语言,编译器将高级语言翻译成机器语言,会先对源代码做词法分析,词法分析是将字符序列转换为Token序列的过程,文章详细介绍需要的小伙伴可以参考一下
    2022-05-05
  • 在Mac OS上安装Go语言编译器的方法

    在Mac OS上安装Go语言编译器的方法

    这篇文章主要介绍了在Mac OS上安装Go语言编译器的方法,Docker的兴起使得Go近来人气大幅攀升,需要的朋友可以参考下
    2015-10-10
  • Go语言模型:string的底层数据结构与高效操作详解

    Go语言模型:string的底层数据结构与高效操作详解

    这篇文章主要介绍了Go语言模型:string的底层数据结构与高效操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论