こんにちは。KOUKIです。
2020年8月から新しい会社でGo言語エンジニアとして働き始める予定です^^
これまで以上にGo言語の理解を深める必要がありますね!
本日は、Stringerを用いてfmt.Printlnの出力形式をカスタマイズするお話をします。
<目次>
Stringerとは
Stringerは、fmtパッケージに定義されているinterfaceです。
1 2 3 |
type Stringer interface { String() string } |
fmtパッケージは、文字出力等を行う機能が詰め込まれているパッケージですが、上記のインターフェースを利用することで、自分好みの出力形式にカスタマイズすることができます。
Stringerを使わない場合
まずは、Stringerを使わない場合のソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import "fmt" type Person struct { Name string Age int } func main() { selfnote := Person{"selfnote", 31} fmt.Println(selfnote) } |
Person Structを定義して、main関数で結果を出力しています。
プログラムを実行してみましょう。
1 2 |
$ go run main.go {selfnote 31} |
Structの中身を出力しただけなので、パラメータの値が出力されました。
この出力結果を自分好みの形式で出力することが可能になります。
Stringerを使った場合
Go言語では、interfaceに定義された関数をメソッドとして定義すると暗黙的にinterfaceを実装したことになります。
つまり、先ほどのStringerインターフェースには、String()関数が定義されているので、これをメソッドとして定義するとStringerインターフェースを暗黙的に実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import "fmt" type Person struct { Name string Age int } func (p Person) String() string { return fmt.Sprintf("I'm %v. I'm %d years old!", p.Name, p.Age) } func main() { selfnote := Person{"selfnote", 31} fmt.Println(selfnote) } |
この状態の時、fmt.Printlnは、(p Person) String()メソッドを優先して処理の呼び出しを行います。
1 2 |
$ go run main.go I'm selfnote. I'm 31 years old! |
カスタマイズした出力結果が表示されましたね!
まとめ
パッケージに定義されているインターフェースを実装すれば、非常に柔軟性の高いプログラミングが可能になります。
今回紹介したStringer以外にもMarshalerのようなjson.Marshalのデフォルトの挙動を変更するインターフェースもあります。
1 2 3 |
type Marshaler interface { MarshalJSON() ([]byte, error) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
func (r *Rara) Hoge() *Signature { // MarshalJSONが呼ばれる m, _ := json.Marshal(t) ... return &Signature{r, s} } func (t *Rara) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Sender string `json:"sender"` Recipient string `json:"recipient"` Value float32 `json:"value"` }{ Sender: t.sender, Recipient: t.recipient, Value: t.value, }) } |
使い方に慣れるまで大変ですが、プロのGo言語エンジニアを目指すものとしては、使いこなしたい機能ですね^^
それでは、また!
最近のコメント