🐐

Golang, mapを用いた存在チェック

2022/03/06に公開

golangで存在チェック(値xがslicenumsに含まれるかチェック)をしようと思ったので、その時に得た知見をまとめる。

存在チェック

アイデア1

単純に、前から見ていく

package main

import (
	"log"
)

func main() {
	oddNums := []int{1, 3, 5, 7, 9}
	nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	for _, v := range nums {
		if contain(v, oddNums) {
			log.Println(v)
		}
	}
}

func contain(x int, list[]int) bool {
	for _, v := range list {
		if v == x {
			return true
		}
	}
	return false
}

アイデア2

mapを使用

package main

import (
	"log"
	"unsafe"
)

func main() {

	oddNums := []int{1, 3, 5, 7, 9}
	nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	// structでmapを作成
	OddnumsMapStruct := make(map[int]struct{}, len(oddNums))
	for _, v := range oddNums {
		OddnumsMapStruct[v] = struct{}{}
	}

	// 存在チェック(struct)
	for _, v := range nums {
		if _, ok := OddnumsMapStruct[v]; ok {
			log.Println(v)
		}
	}

	// boolでmapを作成
	OddnumsMapBool := make(map[int]bool, len(oddNums))
	for _, v := range oddNums {
		OddnumsMapBool[v] = true
	}

	// 存在チェック(bool)
	for _, v := range nums {
		if _, ok := OddnumsMapBool[v]; ok {
			log.Println(v)
		}
	}

	log.Println(unsafe.Sizeof(true))// boolには1byteのメモリが割り当てられる
	log.Println(unsafe.Sizeof(struct{}{}))// structのメモリは要素のメモリサイズの合計。空のstructなら0byte。
}

ポイントは、

OddnumsMapStruct := make(map[int]struct{}, len(oddNums))

のように、struct{}を値としてmapを作成することで、メモリ節約できること。
cf. stackoverflow

参考文献

はてな
はてな
stackoverflow

Discussion