最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang?Template實現(xiàn)自定義函數(shù)的操作指南

 更新時間:2025年02月07日 09:33:43   作者:老大白菜  
這篇文章主要為大家詳細(xì)介紹了Golang如何利用Template實現(xiàn)自定義函數(shù)的操作,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 基礎(chǔ)用法

1.1 創(chuàng)建簡單模板函數(shù)

package main

import (
    "html/template"
    "os"
)

func main() {
    // 創(chuàng)建自定義函數(shù)映射
    funcMap := template.FuncMap{
        "upper": strings.ToUpper,
        "lower": strings.ToLower,
    }
    
    // 創(chuàng)建模板并添加函數(shù)
    tmpl := template.New("test").Funcs(funcMap)
    
    // 解析模板內(nèi)容
    tmpl, err := tmpl.Parse(`
        原始字符串: {{.}}
        大寫: {{upper .}}
        小寫: {{lower .}}
    `)
    
    if err != nil {
        panic(err)
    }
    
    // 執(zhí)行模板
    err = tmpl.Execute(os.Stdout, "Hello, World!")
}

1.2 帶參數(shù)的模板函數(shù)

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 條件判斷函數(shù)

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 := .}}
            數(shù)字 {{$i}} 是: {{if isEven $i}}偶數(shù){{else}}奇數(shù){{end}}
            另一種寫法: {{ifThenElse (isEven $i) "偶數(shù)" "奇數(shù)"}}
        {{end}}
    `)
    
    if err != nil {
        panic(err)
    }
    
    numbers := []int{1, 2, 3, 4, 5}
    err = tmpl.Execute(os.Stdout, numbers)
}

2.2 格式化函數(shù)

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(`
        當(dāng)前時間: {{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 切片操作函數(shù)

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 安全轉(zhuǎn)義

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內(nèi)容: {{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 數(shù)據(jù)過濾和轉(zhuǎn)換

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(`
        原始數(shù)組: {{.}}
        Join結(jié)果: {{join . ","}}
        Split結(jié)果: {{split "a,b,c" ","}}
        Title結(jié)果: {{title "hello world"}}
        Filter結(jié)果: {{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 模板函數(shù)組織

// template_funcs.go
package template

import "html/template"

// 創(chuàng)建全局函數(shù)映射
var GlobalFuncMap = template.FuncMap{
    // 字符串操作
    "upper":      strings.ToUpper,
    "lower":      strings.ToLower,
    "title":      strings.Title,
    
    // 數(shù)值操作
    "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,
}

// 在應(yīng)用中使用
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("除數(shù)不能為零")
            }
            return fmt.Sprintf("%.2f", float64(a)/float64(b)), nil
        },
    }
    
    tmpl := template.New("error").Funcs(funcMap)
    tmpl, err := tmpl.Parse(`
        {{with $result := divide 10 2}}
            結(jié)果: {{$result}}
        {{else}}
            計算出錯
        {{end}}
    `)
    
    if err != nil {
        panic(err)
    }
    
    err = tmpl.Execute(os.Stdout, nil)
}

總結(jié)

1.基本原則

  • 保持函數(shù)簡單明確
  • 注意類型安全
  • 適當(dāng)處理錯誤
  • 避免過度復(fù)雜的邏輯

2.常見用途

  • 文本格式化
  • 數(shù)據(jù)轉(zhuǎn)換
  • 條件判斷
  • 集合操作
  • HTML 安全處理

3.性能考慮

  • 緩存模板
  • 避免重復(fù)解析
  • 合理使用內(nèi)存

到此這篇關(guān)于Golang Template實現(xiàn)自定義函數(shù)的操作指南的文章就介紹到這了,更多相關(guān)Go Template自定義函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語言實現(xiàn)一個簡單的詞頻分析系統(tǒng)

    使用Go語言實現(xiàn)一個簡單的詞頻分析系統(tǒng)

    在數(shù)據(jù)分析和文本挖掘中,詞頻統(tǒng)計(Word Frequency Analysis) 是最基礎(chǔ)也是最常用的技術(shù)之一,本文將帶你用 Go 語言實現(xiàn)一個簡易的 詞頻分析系統(tǒng),感興趣的小伙伴可以了解下
    2025-09-09
  • 一文帶你掌握GoLang中的指針

    一文帶你掌握GoLang中的指針

    針是?Go?編程語言的重要組成部分,它們提供了一種直接引用和操作內(nèi)存中數(shù)據(jù)的方法,在這篇文章中,我們將探討一些技巧和技巧,以掌握?GoLang?中的指針并編寫高效的代碼,需要的可以參考一下
    2023-05-05
  • Go語言學(xué)習(xí)之WaitGroup用法詳解

    Go語言學(xué)習(xí)之WaitGroup用法詳解

    Go語言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細(xì)為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • Go語言中最便捷的http請求包resty的使用詳解

    Go語言中最便捷的http請求包resty的使用詳解

    go語言雖然自身就有net/http包,但是說實話用起來沒那么好用,resty包是go語言中一個非常受歡迎的http請求處理包,下面我們一起來學(xué)習(xí)一下resty的具體使用吧
    2025-03-03
  • Go中標(biāo)準(zhǔn)庫fmt包的使用小結(jié)

    Go中標(biāo)準(zhǔn)庫fmt包的使用小結(jié)

    fmt包是Go語言處理輸入輸出的核心庫,提供Print/Scan系列函數(shù)及多樣格式化動詞(如%v、%d、%s等),支持字符串格式化、掃描、自定義輸出格式及錯誤處理,廣泛用于數(shù)據(jù)格式化與輸出控制,下面就來詳細(xì)的介紹一下
    2025-09-09
  • GoLang職責(zé)鏈模式代碼實現(xiàn)介紹

    GoLang職責(zé)鏈模式代碼實現(xiàn)介紹

    這篇文章主要介紹了GoLang職責(zé)鏈模式代碼實現(xiàn),職責(zé)鏈模式是一種常用的設(shè)計模式,可以提高代碼的靈活性與可維護性,職責(zé)鏈模式將請求和處理分離,可以讓請求在處理鏈中依次經(jīng)過多個處理者,直到找到能夠處理請求的處理者為止
    2023-05-05
  • Golang?中的?條件變量(sync.Cond)詳解

    Golang?中的?條件變量(sync.Cond)詳解

    這篇文章主要介紹了Golang?中的?條件變量(sync.Cond)詳解的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Go語言自定義linter靜態(tài)檢查工具

    Go語言自定義linter靜態(tài)檢查工具

    這篇文章主要介紹了Go語言自定義linter靜態(tài)檢查工具,Go語言是一門編譯型語言,編譯器將高級語言翻譯成機器語言,會先對源代碼做詞法分析,詞法分析是將字符序列轉(zhuǎn)換為Token序列的過程,文章詳細(xì)介紹需要的小伙伴可以參考一下
    2022-05-05
  • 在Mac OS上安裝Go語言編譯器的方法

    在Mac OS上安裝Go語言編譯器的方法

    這篇文章主要介紹了在Mac OS上安裝Go語言編譯器的方法,Docker的興起使得Go近來人氣大幅攀升,需要的朋友可以參考下
    2015-10-10
  • Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    這篇文章主要介紹了Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

循化| 绥中县| 金乡县| 光山县| 沐川县| 马关县| 米脂县| 沙湾县| 安达市| 苏尼特右旗| 沐川县| 壶关县| 收藏| 咸阳市| 临江市| 屏东县| 萨迦县| 东莞市| 日照市| 仙居县| 巍山| 日喀则市| 凤翔县| 海盐县| 台中市| 云梦县| 财经| 宣威市| 阿合奇县| 墨竹工卡县| 鄂州市| 饶河县| 桃源县| 鄂温| 新蔡县| 海阳市| 墨脱县| 马龙县| 灵山县| 乐东| 阳原县|