2016この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。fmtパッケージのインタフェースfmtパッケージにはいくつかインタフェースがあります。ここではフォーマットに関わる以下の3つについて説明していきましょう。StringerGoStringerFormatterStringerインタフェースfmt.Stringerインタフェースは有名でしょう。定義は以下のようになっています。string}%sや%vのフォーマットで文字列を作成する際に、このインタフェースを実装していると、Stringメソッドの実行結果が用いられます。MyString"hello"GoStringerインタフェースStringerインタフェースの例の実行結果を見ると、%#vだけ表示結果がカスタマイズできていません。%#vをカスタマイズするには、fmt.GoStringerインタフェースを実装する必要があります。fmt.GoStringerインタフェースは以下のように定義されています。string}さて、以下のサンプルを動かしてみましょう。うまく%#vの場合もカスタマイズできていることがわかると思います。いう場合は、fmt.Formatterインタフェースを実装してやります。良い例として、pkg/errorsパッケージが参考になるでしょう。以下のコードを見るだけでも、vやsの挙動を変えていることが、なんとなくわかるかと思います。f.msg)}}さて、fmt.Formatterインタフェースの定義を改めて見てみましょう。rune)}Formatというメソッドを実装する必要が分かります。runeは%sや%vのsやvに当たる文字だということが分かります。bool}Stateもインタフェースであることが分かります。ここで注目してほしいのは、Writeメソッドを提供していることです。Stateインタフェースを実装していれば、io.Writerインタフェースも実装している事になります。Stateインタフェースはio.Writerを引数に取るfmt.Fprintfなどの関数に渡せるということになります。察しが良い方は、お気づきかと思いますが、Formatメソッドには戻り値が無いので、StringメソッドやGoStringメソッドのように、カスタマイズしたフォーマットの適用結果を戻り値として返すことができません。代わりに、Stateに対して書き込みを行うことでフォーマットの適用結果を反映させています。続いて、他のStateインタフェースのメソッドについても見てましょう。Widthメソッドは%2dのように幅を指定した際に、その幅を取得するためのメソッドのようです。幅が指定されていない場合は、第2戻り値がfalseになるようです。Precisionメソッドは%.3fなどのように、精度を指定した場合にその値が取得できるメソッドです。こちらも同様に指定されていない場合は、第2戻り値がfalseになります。最後にFlagメソッドは、引数に渡したフラグ+や#が設定されている場合はtrueを返すメソッドです。Flag('+')は、%vの場合はfalseで%+vの場合はtrueを返します。それでは、これらを踏まえて以下のサンプルを動かしてみましょう。幅や精度もうまく指定できていることが分かります。true🍺🍺🍺🌟🌟まとめfmt.Formatを使えば、複雑なフォーマットを自分で作れることを説明しました。デバッグに役立つフォーマットを作ってみてください。CoderPortfolio.。