いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-358 (fmt.Stringerとfmt.GoStringer)(%v, %+v, %#v, %s)

関連記事

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 が反応していますね。

参考情報

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon

上の書籍の日本語版が下です。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。