続・GoでパスワードなどをPrintfで出力させたくない
前回、GoでパスワードなどをPrintfで出力させたくない - kawaken's blog というのを書いたけど、 その後 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
よっしゃー!うまく隠蔽された。
これでログとかに意図せず出力されることが回避できそう。