解析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
相关产品推荐
相关产品推荐

