Как проще всего сравнить, содержат ли две карты одинаковые ключи?
Ключи карты всегда string
, но значение может быть примерно следующим:
map[string]string
map[string]int
map[string][]string
map[string]any
Будет одна карта с необходимыми ключами и целевая карта. Я хочу найти разницу между этими двумя
пример
required_keys := map[string]int{"id": 1, "name": 2}
target := map[string]string{"test": "test", "name": "test"}
fmt.Println("required keys:", required_keys)
fmt.Println("target map:", target)
Вдохновленный одним из ответов (я никогда раньше не использовал дженерики), я попытался написать сигнатуру функции, но получил ошибку
https://go.dev/play/p/C54IfZmDpBQ
package main
import "fmt"
func main() {
r := map[string]int{"id": 1, "name": 2}
t := map[string]string{"test": "test", "name": "test"}
fmt.Println("required", r)
fmt.Println("target", t)
map_keys_diff(r, t)
}
func map_keys_diff[T any](required map[string]T, target map[string]T) {
}
ошибка
in call to map_keys_diff, type map[string]string of t does not match inferred type map[string]int for map[string]T
Не существует встроенной или стандартной библиотечной функции с такой функциональностью, но ее легко написать:
func diff[K comparable, VT any, VR any](target map[K]VT, required map[K]VR) (missing []K) {
for k := range required {
if _, ok := target[k]; !ok {
missing = append(missing, k)
}
}
return
}
Обновленный ответ должен работать — в исходном вопросе не было указано, что значения карты могут быть другими.