🙄

[golang]値の存在確認をスマートに実装する

2024/12/02に公開

この記事は、tacoms Advent Calendar 2024の2日目です!
他メンバーのAdvent Calendarはこちらからご覧ください!👇
https://qiita.com/advent-calendar/2024/tacoms

概要

値の存在確認をシンプルに書けるパッケージを紹介したいと思います。

紹介するパッケージ

PythonのSet型をオマージュしたらしい。
https://github.com/deckarep/golang-set

パッケージ活用のモチベーション

  • 値の存在確認はシンプルに書きたい
  • 普通にやったらmapを都度定義して書かないといけないが、Valueのstruct{}を書くのは冗長だし、そもそも見慣れない人はなんでValueが空なのか?と思ってしまう

実装例

使わない場合

type Store struct {
	ID   uint
	Name string
}

var stores = []Store{
	{1, "store1"},
	{2, "store2"},
	{3, "store3"},
}

func sample1() {
	ids := map[uint]struct{}{
		2: {},
	}
	for _, store := range stores {
		if _, ok := ids[store.ID]; ok {
			// store2
			fmt.Println(store.Name)
		}
	}
}

使った場合

type Store struct {
	ID   uint
	Name string
}

var stores = []Store{
	{1, "store1"},
	{2, "store2"},
	{3, "store3"},
}

func sample2() {
	ids := mapset.NewSet[uint](2)
	for _, store := range stores {
		if ids.Contains(store.ID) {
			// store2
			fmt.Println(store.Name)
		}
	}
}

まとめ

存在確認をシンプルに実装できるライブラリを紹介しました。
複雑な実装の中で使うとより顕著にスマートさが表れてくるので、気になった方はぜひ使ってみてください。

tacomsテックブログ

Discussion