Сравните ключи на картах на предмет различий

Как проще всего сравнить, содержат ли две карты одинаковые ключи?

Ключи карты всегда 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

Обновленный ответ должен работать — в исходном вопросе не было указано, что значения карты могут быть другими.

Will Beason 23.08.2024 01:28
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не существует встроенной или стандартной библиотечной функции с такой функциональностью, но ее легко написать:

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
}

https://go.dev/play/p/K7-Ts2QnybJ

Другие вопросы по теме