いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-618 (templateのオプションでmissingkey=zeroを設定した場合の挙動)(text/template,html/template)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。何回かハマってしまっているので、忘れないようにメモメモ。。。

テンプレートオブジェクトの Template.Option にて、missingkey=zero を指定した場合、キーが存在しない場合にゼロ値が出力されますがテンプレート出力の際に指定する型で map[string]any を与えた場合、ゼロ値を出力せよと設定していても、<no value> と表示されることに注意。

ちょちょいとテンプレート処理したい場合、いちいち構造体定義するの面倒なので、さくっと map[string]any で処理しようとして、何故か <no value> って出力されるので「何で?」って何度かなっています。

サンプル

missingkey.go

package txttmpl

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

// MissingKey -- text/template の missingkey=zero オプション指定時のサンプルです。
//
// Template.Option("missingkey=zero")の設定を行い、テンプレートに対して map[string]any をデータとして指定した場合
// キーが存在しないの場合、"<no value>" と表示されることに注意。(マップの値の方の方がanyのため)
//
// 当然、any以外の場合はその型のゼロ値となる。
//
// # REFERENCES
//   - https://pkg.go.dev/text/template@latest
func MissingKey() error {
    const (
        TEXT = `{{.Value}} world`
    )
    var (
        mAny = map[string]any{"Value": "hello"}
        mStr = map[string]string{"Value": "hello"}
        mInt = map[string]int{"Value": 100}

        t  = template.Must(template.New("MissingKey").Option("missingkey=zero").Parse(TEXT))
        fn = func(message string) {
            fmt.Printf("[%s] -----------------------\n", message)
            t.Execute(os.Stdout, mAny)
            fmt.Println("")
            t.Execute(os.Stdout, mStr)
            fmt.Println("")
            t.Execute(os.Stdout, mInt)
            fmt.Println("")
        }
    )
    fn("キーあり")

    delete(mAny, "Value")
    delete(mStr, "Value")
    delete(mInt, "Value")

    fn("キーなし")

    return nil
}

実行結果

$ task
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: templates_text_tmpl_missingkey

[Name] "templates_text_tmpl_missingkey"
[キーあり] -----------------------
hello world
hello world
100 world
[キーなし] -----------------------
<no value> world
world
0 world

[Elapsed] 79.082µs

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。