4

この質問は、他の多くの言語ですでに回答されています。単純なマップ (ネストなし) を使用する 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、型のゼロ値を返し、それを何も比較できないようにします。

結局、私は同じ仕事をより良くすることができますか?

4

3 に答える 3