はじめに
Goには、集合型が存在しない。Goで集合型っぽいことを実装するには様々な方法があるが、空のstructをvalueとして持つmap型を定義する方法が使い勝手が良い。今回はこれを利用してSet型の定義を行い、簡易なメソッドを実装してみよう。
実装
type Set map[interface{}]struct{} // Set型の定義
func NewSet() *Set { // 新しい集合を作成
return &Set{}
}
func (s Set) Add(key interface{}) { // 集合に値を追加
s[key] = struct{}{}
}
func (s Set) Delete(key interface{}) { // 集合から値を削除
_, ok := s[key] // 値の存在判定
if ok {
delete(s, key)
}
}
※今回は簡易的な実装のためmapのkey(interface{})の型判定は実装していない
How to use
func main() {
s := NewSet() // 集合を作成
s.Add("a") // 値の追加
s.Add("b") // 値の追加
s.Add("c") // 値の追加
fmt.Println("Before:", len(*s), s) // map型のためlen()関数が利用可
s.Delete("b") // 値の削除
fmt.Println("After :")
for k, _ := range s { // 値を取り出すときはmapと同じように
fmt.Println(k.(string))
}
}
出力
Before: 3 &map[a:{} b:{} c:{}]
After :
a
c