emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go で複数の文字を一括で別の文字に置換する

Overview

Go で文字列の中で特定の文字を別の文字に置換したいケース、例えば改行コードやタブが混じっている文字列の中で特殊文字だけをエスケープしたいケースなどで strings.Replace を多用するのではなく、一括で置換する実装について記載します。

strings.NewReplacer を使う

https://pkg.go.dev/strings#example-NewReplacer を使います。

使い方

以下のような実装でタブと改行コードを一括でエスケープ可能です。

strings.NewReplacer("\t", "\\t", "\n", "\\n", "\r", "\\r").Replace("hogehoge...")

上記は公式のドキュメントに記載されてるとおりですが、今回は簡単なユースケースとして http のリクエストとレスポンスをダンプしたときの出力を考えます。

http のリクエストとレスポンスを dump したとき、その中には改行コードが複数入っています。これらをそのまま "" で出力してしまうと、特殊文字が評価されて、dump 結果の改行コード移行が別の標準出力になってしまい、正しくログに出力されない(トレースした結果に出力されない)といったことが発生します。

そのため、出力する結果は適切にエスケープされていてほしいです。このとき何度も置換の実装を書くのではなく、 Replacer を使うと1行で置換の処理を複数の特殊文字に割り当てることができます(便利)