2014-09-10 4 views
5

Я столкнулся с этой проблемой несколько раз, когда захотел использовать ключи карт аналогичным образом, но значения на картах разные. Я думал, что могу написать функцию, которая использует тип ключа, который я хочу с интерфейсом {}, как тип значения, но он не работает.Значение общей карты Go Lang

func main() { 
    mapOne := map[string]int 
    mapTwo := map[string]double 
    mapThree := map[string]SomeStruct 

    useKeys(mapOne) 
} 
func useKeys(m map[string]interface{}) { 
    //something with keys here 
} 

Не уверены, что если есть элегантный способ сделать это, я просто чувствую талии полных переписываний простых вещей для различных значений.

+2

Если вы знаете фронт каких значений вы обеспокоены, вы можете написать один 'func keys (m interface {})' (или функция, которая дает клавиши поэтапно через канал или путем вызова функции) и выполняет [переключатель типа] (http://golang.org/ref/spec#Type_switches) в Это. Но я склонен просто повторять цикл везде, где вы хотите использовать все ключи, а не только для общих «писать Go Go Go», а для большей проверки типа компиляции. – twotwotwo

ответ

9

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

Если вы действительно просто нужно получить ключи от любой старой карты, вы можете использовать отражение, чтобы сделать так:

func useKeys(m interface{}) { 
    v := reflect.ValueOf(m) 
    if v.Kind() != reflect.Map { 
     fmt.Println("not a map!") 
     return 
    } 

    keys := v.MapKeys() 
    fmt.Println(keys) 
} 
+0

Спасибо. Я знал, что это какой-то аспект языка, который я не понимал. – mvryan

Смежные вопросы