【问题标题】:Range over string slice in golang templategolang模板中字符串切片的范围
【发布时间】:2019-06-06 22:36:55
【问题描述】:

我有一个结构,它包含一个字符串类型的切片,如下所示。

 type Data struct {
      DataFields []string
 }

在我的 html 模板文件中,我想覆盖字符串切片。但是,各个字段只是没有任何结构名称的字符串。如何遍历包含简单类型(如字符串、int 等)的切片?

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    使用. 来引用字符串、int 等简单值。

     {{range .DataFields}}{{.}}{{end}}
    

    Run it on the Playground.

    您也可以像{{range $v := .DataFields}}{{$v}}{{end}} 那样分配给模板变量,但这是额外的工作。拥抱.

    【讨论】:

    • 就个人而言,第二种语法{{range $v := .DataFields}}{{$v}}{{end}} 为屏幕上更多字符的可读性提供了显着优势。我会权衡取舍!
    【解决方案2】:

    或者将其赋值给一个变量,类似于普通的 Go 范围子句:

     {{range $element := .DataFields}} {{$element}} {{end}}
    

    Run it on the Playground

    来自docs for text/template(用作html/模板的接口文档):

    {{range pipeline}} T1 {{end}}
        管道的值必须是数组、切片、映射或通道。
        如果管道的值长度为零,则不输出任何内容;
        否则, dot 被设置为数组的连续元素,
        切片或映射 并执行 T1。如果值是地图并且
        键是具有定义顺序的基本类型(“可比较”),
        元素将按排序键顺序访问。

    ...

    动作中的管道可能会初始化一个变量来捕获结果。初始化有语法

    $variable := pipeline

    ...

    如果一个“范围”动作初始化一个变量,该变量被设置为迭代的连续元素。此外,“范围”可以声明两个变量,用逗号分隔:

    range $index, $element := pipeline

    在这种情况下,$index 和 $element 分别设置为数组/切片索引或映射键和元素的连续值。 注意,如果只有一个变量,则赋值为元素;这与 Go range 子句中的约定相反。

    (我强调的粗体部分)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 2018-02-07
      • 2014-09-30
      • 2015-09-15
      • 2017-11-30
      • 1970-01-01
      • 2017-03-12
      • 2016-03-21
      相关资源
      最近更新 更多