LoginSignup
1
2

More than 1 year has passed since last update.

Goで簡易な集合型を実装してみよう

Last updated at Posted at 2022-09-16

はじめに

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

参考資料

GoでSet型を実現する場合の選択肢

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2