1.単純な文字列
「単純な」文字列(通常は行に収まる文字列)の場合、最も簡単な解決策はとを使用することですfmt.Sprintf()
(fmt.Sprint()
、fmt.Sprintln()
)。これらは、スターターS
レターのない関数に似ていますが、これらのSxxx()
バリアントstring
は、標準出力に出力する代わりに、結果をとして返します。
例えば:
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
変数s
は次の値で初期化されます。
Hi, my name is Bob and I'm 23 years old.
ヒント:異なるタイプの値を連結するだけの場合Sprintf()
は、これとSprint()
まったく同じように、自動的に使用する必要はありません(フォーマット文字列が必要です)。この例を見てください:
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
string
s のみを連結する場合は、(結合する文字列の間に配置する)strings.Join()
カスタムセパレーターを指定できる場所を使用することもできますstring
。
Go Playgroundでお試しください。
2.複雑な文字列(ドキュメント)
作成しようとしている文字列がより複雑な場合(たとえば、複数行の電子メールメッセージ)、fmt.Sprintf()
可読性と効率が低下します(特にこれを何度も行う必要がある場合)。
このために、標準ライブラリはパッケージtext/template
とを提供しますhtml/template
。これらのパッケージは、テキスト出力を生成するためのデータ駆動型テンプレートを実装しています。html/template
コードインジェクションに対して安全なHTML出力を生成するためのものです。これはパッケージtext/template
と同じインターフェースを提供しtext/template
、出力がHTMLの場合は常に使用する必要があります。
template
パッケージを使用するには、基本的にstring
値の形式で静的テンプレートを提供する必要があります(これはファイルから発生する場合があり、その場合はファイル名のみを提供します)。静的テキストと、エンジンはテンプレートを処理し、出力を生成します。
静的テンプレートに含まれる/置換されるパラメーターを指定して、出力生成プロセスを制御できます。そのようなパラメーターの典型的な形式は、ネストされているstruct
sとmap
valueです。
例:
たとえば、次のような電子メールメッセージを生成するとします。
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
このような電子メールメッセージの本文を生成するには、次の静的テンプレートを使用できます。
const emailTmpl = `Hi {{.Name}}!
Your account is ready, your user name is: {{.UserName}}
You have the following roles assigned:
{{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}
`
そして、それを実行するためにこのようなデータを提供します:
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
通常、テンプレートの出力はに書き込まれるio.Writer
ため、結果をとして取得したい場合はstring
、作成してに書き込みますbytes.Buffer
(これはを実装しますio.Writer
)。テンプレートを実行し、結果をstring
次のように取得します。
t := template.Must(template.New("email").Parse(emailTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
panic(err)
}
s := buf.String()
これにより、期待される出力が得られます。
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Go Playgroundでお試しください。
またゴー1.10、以来、新しい、より速く、より多くの専門代替に利用可能であることに注意bytes.Buffer
しています:strings.Builder
。使い方は非常に似ています:
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Go Playgroundでこれを試してください。
注:os.Stdout
ターゲットとしてを指定した場合は、テンプレートの実行結果を表示することもできます(これもを実装していますio.Writer
)。
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
これにより、結果が直接に書き込まれos.Stdout
ます。Go Playgroundで試してみてください。