Go Template 模板高级用法

Go About 1,293 words

解析模板

var externalFs fs.FS

tmpl, err := template.ParseFS(externalFs, "*.gohtml")
if err != nil {
    log.Fatal("template parse error:", err)
}

注册函数

使用Funcs注册更多的函数,用于模板。

var externalFs fs.FS

var funcMap = map[string]any{
    "contains":  strings.Contains,
    "hasPrefix": strings.HasPrefix,
    "hasSuffix": strings.HasSuffix,
    "loop": func(n int) []struct{} {
        return make([]struct{}, n)
    },
    "add": func(i int, delta int) int {
        return i + delta
    },
}

tmpl, err := template.New("externalFs").Funcs(funcMap).ParseFS(externalFs, "*.gohtml")
if err != nil {
    log.Fatal("template parse error:", err)
}

传递参数

type Attr struct {
    Req     *http.Request
    Data    any
    Time    time.Time
}

attr := Attr{
    Req:     r,
    Data:    data,
    Time:    time.Now(),
}

tmpl.ExecuteTemplate(os.Stdout, "post", attr)

{{.}}

.代表传入的attr变量。attr中的字段可以继续使用.来获取。

{{.}}

{{.Time}}

调用方法

方法的括号不用加。

{{.Time.Year}}

接收变量

将传入的attr$x变量接收,$x作用域在整个模板文件中有效。

{{ $x := . }}

逻辑与 逻辑或

andor

示例:如果1==1并且2==2

{{ if and (eq 1 1) (eq 2 2) }}

{{ end }}

示例:如果1==2或者2==2,如果第一个条件满足了,就不会判断后面一个条件。

{{ if or (eq 1 2) (eq 2 2) }}

{{ end }}

. 作用域范围

ifwithrange中的.会改变为这三个表达式中的对象。

示例:with接收.Time对象,代码块中.Year.代表Time对象。

{{ with .Time }}
    {{.Year}}
{{ end }}

参考

https://pkg.go.dev/text/template

Views: 806 · Posted: 2023-10-10

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh