小ネタです。
GoのMapのkey
goはmapの初期化時以下のように「keyの型」と「valueの型」を両方宣言しますが、
m := make(map[string]string)
この「keyの型」には当然interface(空interface含む)を指定することもできる。
m := make(map[io.Reader]string) // これとか
m := make(map[interface{}]string) // これ
このような場合、実際に値を入れるときに型が違えば当然keyも違う。
要するにこういうことです
type dog int
type cat int
m := make(map[interface{}]string)
m[dog(1)] = "dog dayo"
m[cat(1)] = "cat dayo"
fmt.Printf("%v", m) // map[1:dog dayo 1:cat dayo]
// 拡張int同士、同じ数字だがkeyは違う
同じintを拡張したdog,cat型ですが、keyの見た目は数字の1で重複しているのに
型が違うので上書きではなく新規登録になっていますね。
structで全く新しい型を作った場合は「まぁそうだろうな」と直感でわかりますが、
同じintを拡張した型同士でもしっかりと別型として扱われます。
さすがにinterface{}ほどゆるいkeyを使うことってないかもしれないですが、
(というか殆どの場合keyはintやstringといったプリミティブ型だと思いますが)
一応このような仕様になってますよということで。