You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析Go模板时如何判断模板节点是否带有连字符?

区分Go模板中带连字符的节点

可以区分。text/template/parse包中的节点类型包含空白控制的元数据,只是String()方法未输出这些信息。

具体来说,*parse.IfNode包含Begin和End两个*parse.ActionNode字段,分别对应if和end的模板指令。ActionNode自带TrimLeft和TrimRight布尔字段:

  • TrimLeft为true表示指令开头是{{-(左侧连字符,会修剪前面的空白)
  • TrimRight为true表示指令结尾是-}}(右侧连字符,会修剪后面的空白)

修改你的代码,检查这些字段即可区分两种情况:

import (
    "fmt"
    "text/template"
    "text/template/parse"
)

func main() {
    templateText := `{{- if .Tools }}
{{- end }}

{{ if .Tools }}
{{ end }}`

    t, err := template.New("dummy").Parse(templateText)
    if err != nil {
        panic(err)
    }

    for _, tt := range t.Templates() {
        for _, n := range tt.Root.Nodes {
            switch n := n.(type) {
            case *parse.IfNode:
                // 检查if指令的空白控制
                if n.Begin.TrimLeft {
                    fmt.Println("if指令左侧带连字符")
                }
                if n.Begin.TrimRight {
                    fmt.Println("if指令右侧带连字符")
                }
                // 检查end指令的空白控制
                if n.End.TrimLeft {
                    fmt.Println("end指令左侧带连字符")
                }
                if n.End.TrimRight {
                    fmt.Println("end指令右侧带连字符")
                }
                fmt.Println("---")
            }
        }
    }
}

运行这段代码会输出:

if指令左侧带连字符
if指令右侧带连字符
end指令左侧带连字符
end指令右侧带连字符
---
---

第一个if-end块的Begin和End节点的TrimLeft、TrimRight都为true,第二个块的对应字段则为false,以此实现区分。

内容的提问来源于stack exchange,提问作者MavWolverine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:14:56