3 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
我想要一個(gè)通用方法。
現(xiàn)在Go 1.18和泛型在這里,你可以寫(xiě)這樣一個(gè)泛型函數(shù);見(jiàn)下文和這個(gè)游樂(lè)場(chǎng)。通常不鼓勵(lì)進(jìn)行反射,實(shí)現(xiàn)此功能不需要反射。
package main
import "fmt"
func IsMapSubset[K, V comparable](m, sub map[K]V) bool {
if len(sub) > len(m) {
return false
}
for k, vsub := range sub {
if vm, found := m[k]; !found || vm != vsub {
return false
}
}
return true
}
type MyMap map[string]string
func main() {
a := map[string]string{"a": "b", "c": "d", "e": "f"}
b := map[string]string{"a": "b", "e": "f"}
c := map[string]string{"a": "b", "e": "g"}
fmt.Println(IsMapSubset(a, b))
fmt.Println(IsMapSubset(a, c))
fmt.Println(IsMapSubset(MyMap(a), c))
}
輸出:
true
false
不過(guò),關(guān)于NaN的常見(jiàn)警告適用。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
Value.MapIndex()
返回一個(gè)反射。值
,它是一個(gè)結(jié)構(gòu),不是結(jié)構(gòu)的有效值。不能將結(jié)構(gòu)值與 進(jìn)行比較。nil
nil
Value.MapIndex()
聲明:
如果在映射中找不到鍵,或者如果 v 表示 nil 映射,則返回零值。
因此,要判斷是否在映射中找不到該鍵,請(qǐng)檢查返回的鍵是否為其零值。為此,您可以使用 Value.IsValid()
方法。reflect.Value
您也不能(不應(yīng)該)比較值。而是使用 Value.Interface()
獲取其包裝值,并對(duì)其進(jìn)行比較。reflect.Value
if v2 := mapSetValue.MapIndex(k); !v2.IsValid() || v.Interface() != v2.Interface() { return false}
測(cè)試它:
a := map[string]string{"a": "b", "c": "d", "e": "f"} b := map[string]string{"a": "b", "e": "f"} fmt.Println(IsMapSubset(a, b)) c := map[string]string{"a": "b", "e": "X"} fmt.Println(IsMapSubset(a, c))
輸出將是(在Go Playground上嘗試):
truefalse

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是工作解決方案,以防有人需要:
// IsMapSubset returns true if mapSubset is a subset of mapSet otherwise false
func IsMapSubset(mapSet interface{}, mapSubset interface{}) bool {
mapSetValue := reflect.ValueOf(mapSet)
mapSubsetValue := reflect.ValueOf(mapSubset)
if fmt.Sprintf("%T", mapSet) != fmt.Sprintf("%T", mapSubset) {
return false
}
if len(mapSetValue.MapKeys()) < len(mapSubsetValue.MapKeys()) {
return false
}
if len(mapSubsetValue.MapKeys()) == 0 {
return true
}
iterMapSubset := mapSubsetValue.MapRange()
for iterMapSubset.Next() {
k := iterMapSubset.Key()
v := iterMapSubset.Value()
value := mapSetValue.MapIndex(k)
if !value.IsValid() || v.Interface() != value.Interface() {
return false
}
}
return true
}
- 3 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)