8

Go テンプレートを使用して配列をループしようとしていて、ループの最後の項目に余分な文字列を追加したいと考えています。

Pythonでは、私はできる

{% for host in hosts %}
{{ host }}{% if loop.last %} ;{% endif %}
{% endfor %}

Go で同じことを達成するために、以下は Go と同等のスニペットです。

{{ range $host := $hosts }}
{{$host}}
{{ end }}

ありがとう。

4

2 に答える 2

3

リストが空でない場合、Python スニペットは最後の項目の後にセミコロンを出力します。範囲を if で囲み、スライスに少なくとも 1 つの要素があるかどうかを確認して ; を出力することで、Go でも同じ結果を得ることができます。ループの外側。

{{if $hosts}}{{range $host := $hosts}}
{{$host}}
{{ end }} ;{{end}}

このスニペットは、最後のアイテムの最後に追加しているため機能します。より一般的なソリューションには、カスタム テンプレート関数が必要です。関数の例を次に示します。

func last(v interface{}, i int) (bool, error) {
  rv := reflect.ValueOf(v)
  if rv.Kind() != reflect.Slice {
    return false, errors.New("not a slice")
  }
  return rv.Len()-1 == i, nil
}

テンプレートでそれを使用する方法は次のとおりです。

{{range $i, $host := $hosts }}
{{$host}}{{if last $hosts $i}} ;{{end}}
{{ end }}

カスタム関数の実例をプレイグラウンドに投稿しました。

于 2014-11-29T21:21:45.150 に答える