Функция, которая берет карту и заботится только о типе ключа - PullRequest
0 голосов
/ 31 января 2019

У меня есть две карты, обе они обозначены strings, но значения имеют два разных пользовательских типа.

map[string]type1
map[string]type2

Теперь я хочу написать функцию, которая может принимать аргументы любого из этих двух типов, потому что эта функция смотрит только на ключи и не заботится о значениях вообще.Поэтому я думаю, что это должно выглядеть так:

func takeTheMap(argument map[string]interface{}) {
...

Но это не работает из-за:

cannot use myVariable (type map[string]customType) as type map[string]interface {} in argument to takeTheMap

https://play.golang.org/p/4Xkhi4HekO5

Могу ли я сделать эту работукаким-то образом?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Решение с использованием интерфейса.Этот пример может показаться немного излишним, и в вашем случае может быть лучше (я не уверен, недостаточно подробностей в вашем примере) просто использовать пару for петель.

package main

import (
    "fmt"
)

type foo bool
type bar string

type mapOne map[string]foo
type mapTwo map[string]bar

func (m mapOne) Keys() []string {
    s := []string{}
    for k := range m {
        s = append(s, k)
    }
    return s
}

func (m mapTwo) Keys() []string {
    s := []string{}
    for k := range m {
        s = append(s, k)
    }
    return s
}

type ToKeys interface {
    Keys() []string
}

func main() {
    m1 := mapOne{"one": true, "two": false}
    m2 := mapTwo{"three": "foo", "four": "bar"}

    doSomething(m1)
    doSomething(m2)
}

func doSomething(m ToKeys) {
    fmt.Println(m.Keys())
}

Детская площадка пример

0 голосов
/ 31 января 2019

Единственный полиморфизм в Go - это интерфейсы.Единственными альтернативами этому являются отражение, дублирование или переосмысление более широкого дизайна, чтобы вам не нужно было делать то, что вы пытаетесь сделать здесь.

Если последний вариант не представляется возможным, личноЯ бы порекомендовал дублирование, так как это целые четыре строки кода.

keys := make([]string, 0, len(myMap))
for key,_ := range myMap {
    keys = append(keys,key)
}

Большой сложный универсальный помощник кажется ненужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...