🐐
Golang, mapを用いた存在チェック
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
Discussion