重複してるアイテムを抽出できる。位置とか取れないし、可読性悪いし、実用性低いけど。
package main
import (
"fmt"
)
func main() {
list := []string{
"foo",
"bar",
"baz",
"foo",
"bar",
}
dups := map[string]bool{}
for _, item := range list {
_, dups[item] = dups[item]
}
fmt.Printf("%+v", dups) // map[foo:true bar:true baz:false]
}
キモは
_, dups[item] = dups[item]
の一行で、mapのキー存在チェックが2つ目のリターンで取得できることに依ってる。
-
dups
にitem
がキーとして存在しない -
dups[item]
でfalse, false
が返る -
_, dups[item] = false, false
となるためitem
がdups
のキーに入る。値はfalse
。 - もう一度同じ値の
item
で処理すると、dups[item]
でfalse, true
が返る -
_, dups[item] = false, true
となるため、dups[item]
がtrue
になる
Twitterでつぶやくだけつぶやいてたんだけど、「なんか重複チェックについてすげーひらめき昔しなかったけ」となって、
無駄に期待する羽目になった(そしてやっぱり役に立たずがっかりした)のでQiitaにも転載しとく。