この質問は、他の多くの言語ですでに回答されています。単純なマップ (ネストなし) を使用する golang で、マップが別のマップのサブセットであるかどうかを調べる方法。例:map[string]string{"a": "b", "e": "f"}
のサブセットですmap[string]string{"a": "b", "c": "d", "e": "f"}
。ジェネリックメソッドが欲しい。私のコード:
package main
import (
"fmt"
"reflect"
)
func main() {
a := map[string]string{"a": "b", "c": "d", "e": "f"}
b := map[string]string{"a": "b", "e": "f"}
c := IsMapSubset(a, b)
fmt.Println(c)
}
func IsMapSubset(mapSet interface{}, mapSubset interface{}) bool {
mapSetValue := reflect.ValueOf(mapSet)
mapSubsetValue := reflect.ValueOf(mapSubset)
if mapSetValue.Kind() != reflect.Map || mapSubsetValue.Kind() != reflect.Map {
return false
}
if reflect.TypeOf(mapSetValue) != reflect.TypeOf(mapSubsetValue) {
return false
}
if len(mapSubsetValue.MapKeys()) == 0 {
return true
}
iterMapSubset := mapSubsetValue.MapRange()
for iterMapSubset.Next() {
k := iterMapSubset.Key()
v := iterMapSubset.Value()
if value := mapSetValue.MapIndex(k); value == nil || v != value { // invalid: value == nil
return false
}
}
return true
}
セットマップにサブセットマップキーが存在するかどうかを確認したい場合MapIndex
、型のゼロ値を返し、それを何も比較できないようにします。
結局、私は同じ仕事をより良くすることができますか?