続・GoでパスワードなどをPrintfで出力させたくない

前回、GoでパスワードなどをPrintfで出力させたくない - kawaken's blog というのを書いたけど、 その後 GoStringer というインターフェースがあることを知ったので再度試してみた。

前回のおさらい

前回上手く隠蔽できずに出力されてしまったのが、以下。 %+v だと出力されないんだけど、%#vだと出力されてしまう…

type Password string

func (p Password) String() string {
    return "FILTERED"
}

type User struct {
    Name     string
    Password Password
}

func main() {
    u := &User{
        Name:     "namae",
        Password: Password("pass"),
    }

    fmt.Printf("%#v", u)
    // &main.User{Name:"namae", Password:"pass"}

}

https://play.golang.org/p/1BT9E4dM17

GoStringerを実装する

package main

import (
    "fmt"
)

type Password string

func (p Password) String() string {
    return "FILTERED by String"
}

func (p Password) GoString() string {
    return "FILTERED by GoString"
}

type User struct {
    Name     string
    Password Password
}

func main() {
    u := &User{
        Name:     "namae",
        Password: Password("pass"),
    }

    fmt.Printf("%#v", u)
    // &main.User{Name:"namae", Password:FILTERED by GoString}

}

https://play.golang.org/p/H_ccstzjCC

よっしゃー!うまく隠蔽された。

これでログとかに意図せず出力されることが回避できそう。