记录golang template语法的一点小经验


golang的官方文档写的很简洁,稍微复杂一些的功能和方法,有时候比较难以理解,比如template的用法介绍,就有很多地方不明白。这两天发现两个自己没有明白的地方,一个是局部变量与顶级变量的用法,一个是自定义视图函数的用法。记录如下

1. with区块下使用全局变量
官方文档,中对于在with和range等动作中使用变量的说法说的不是很明白,在这种动作中应当这样使用,比如.Var2,需要这样写:$.Var2。
下面例举一个完整的列子

{{with $data := .Data.GetDataOrCreate .id}}
    {{if $data.IsEmpty}}
        {{GetOneString "title" | $.Data.SetData $data "title"}}
        {{$.MapData.Save $data}}
    {{end}}
    {{$data.Data.Get "title"}}
{{end}}

上面的用法的原因在于作用域的问题,.始终代表当前对象,相当于java等语言中的this。$永远都代表全局作用域。

2. 视图中调用函数的要求
在视图中使用自定义函数或者对象的方法,必须要有返回值,没有返回值的函数会报错,这点官方文档说的很明白,一开始没理解到位。官方:A pipeline is a possibly chained sequence of "commands". A command is a simple value (argument) or a function or method call, possibly with multiple arguments。意思就是这个“pipeline”必须要有值!如果函数返回布尔值也会如实的显示在结果中,想到的一个办法是在普通函数与视图增加一层包装,在视图中使用针对视图调整的函数即可。

Archives