関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。よく忘れるのでここにメモメモ。。。
上記の書籍に fmt.Stringer と fmt.GoStringer インターフェースを使って機密情報をロギングするのを防ぐというTipsが載っていました。
そういえば、fmt.GoStringerってインターフェースがあったなーって思い出したので、ついでに自分用のサンプルをここにメモメモ。。。
試してみた
package formatting import ( "encoding/json" "fmt" "strconv" ) type _MyInt int func (me _MyInt) String() string { return fmt.Sprintf("stringer: %d", me) } func (me _MyInt) GoString() string { return fmt.Sprintf("gostring: %d", me) } // StringerAndGoStringer は、fmt.Stringerとfmt.GoStringerについてのサンプルです. // // # REFERENCES // - https://pkg.go.dev/fmt@go1.21.4#Stringer // - https://pkg.go.dev/fmt@go1.21.4#GoStringer func StringerAndGoStringer() error { // // fmt.Stringer と fmt.GoStringer の違い // // どちらも文字列表現のためのインターフェースであるが // fmt.GoStringerの方は GoString() を呼ばれた場合に発動する. // これは、fmt.Printf などで %#v を利用してフォーマットしようとする際に使われる // var ( i = _MyInt(100) s = strconv.Itoa((int)(i)) b, _ = json.Marshal(i) ) fmt.Printf("v: %v\t+v: %+v\t#v: %#v\tjson: %s\ts: %s", i, i, i, b, s) return nil }
実行すると以下のようになります。
$ task task: [run] ./try-golang -onetime ENTER EXAMPLE NAME: formatting_stringer_and_gostringer [Name] "formatting_stringer_and_gostringer" v: stringer: 100 +v: stringer: 100 #v: gostring: 100 json: 100 s: 100 [Elapsed] 54.79µs
%v
, %+v
のときは fmt.Stringer, %#v
のときは fmt.GoStringer が反応していますね。
参考情報
- Documentation - The Go Programming Language
- GitHub - golang-standards/project-layout: Standard Go Project Layout
Goのおすすめ書籍
上の書籍の日本語版が下です。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。