続・GoでパスワードなどをPrintfで出力させたくない
2016-11-16 / Go
前回、Go でパスワードなどを Printf で出力させたくないというのを書いたけど、
その後 GoStringer というインターフェースがあることを知ったので再度試してみた。
- fmt.Formatter を実装して%v や%+v をカスタマイズしたり、%3🍺 みたいな書式をつくってみよう #golang - Qiita
 - fmt - The Go Programming Language
 
前回のおさらい
前回上手く隠蔽できずに出力されてしまったのが、以下。
%+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
よっしゃー!うまく隠蔽された。
これでログとかに意図せず出力されることが回避できそう。