html/templateで key=val を出力する際は template.HTMLAttr型を使う

すごい久しぶりに goコードを書いたらいろいろと忘れていたのでメモ

templateに任意の属性を出力するようなコードを書きたかったが,

package main

import (
        "html/template"
        "log"
        "os"
)

var htmlTemplate = `
<p {{.Attr}}>
`

type Data struct {
        Attr string
}

func main() {
        t, err := template.New("test").Parse(htmlTemplate)
        if err != nil {
                log.Fatal(err)
        }

        d := Data{
                Attr: `class="foo"`,
        }

        if err := t.Execute(os.Stdout, &d); err != nil {
                log.Fatal(err)
        }
}

string と宣言してしまうと下記のようになってしまう

<p ZgotmplZ>

どうするだと思って調べたところ template.HTMLAttr 型を使えばよかった

package main

import (
    "html/template"
    "log"
    "os"
)

var htmlTemplate = `
<p {{.Attr}}>
`

type Data struct {
    Attr template.HTMLAttr
}

func main() {
    t, err := template.New("test").Parse(htmlTemplate)
    if err != nil {
        log.Fatal(err)
    }

    d := Data{
        Attr: `class="foo"`,
    }

    if err := t.Execute(os.Stdout, &d); err != nil {
        log.Fatal(err)
    }
}

出力は以下のようになる

<p class="foo">

ドキュメントにあるように信頼できる入力に対してのみ使うべきで何でも使うべきではないので利用の際は注意が必要