2015-02-13 8 views
0

Я посмотрел Structs as keys in Golang mapsзначение Iterate Struct (карта ключа) в golang

Я понимаю итерации по картам в golang не имеет гарантированный заказ. Я следил за example in golang blog и пытался использовать struct в качестве ключа карты.

Вот мой код

package main 

func main() { 
    req := make(map[mapKey]string) 

    req[mapKey{1, "r"}] = "robpike" 
    req[mapKey{2, "gri"}] = "robert griesemer" 
    req[mapKey{3, "adg"}] = "andrew gerrand" 
    req[mapKey{4, "rsc"}] = "russ cox" 

    var keys []int 
    for k := range req { 
     keys = append(keys, k.Key) 
    } 

    for _, k := range keys { 
     fmt.Printf("short name : %s , long name : %s\n",req[k], req[k]) // How do I iterate here 
    } 

    sort.Ints(keys) 
} 

type mapKey struct { 
    Key int 
    Option string 
} 

То, что я хочу, чтобы результаты были в

short name : r , long name : rob pike 
short name : gri , long name : robert griesemer 
short name : adg , long name : andrew gerrand 
short name : rsc , long name : russ cox 

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

+0

О, я думаю, что нашел что-то подобное [golang map prints не работает] (http://stackoverflow.com/questions/12108215/golang-map-prints-out-of-order) –

ответ

3

Краткая версия? Вы не можете так поступать.

Длинная версия вы, вы можете использовать собственный сортировщик:

func main() { 
    req := make(map[mapKey]string) 

    req[mapKey{1, "r"}] = "robpike" 
    req[mapKey{2, "gri"}] = "robert griesemer" 
    req[mapKey{3, "adg"}] = "andrew gerrand" 
    req[mapKey{4, "rsc"}] = "russ cox" 

    var keys mapKeys 
    for k := range req { 
     keys = append(keys, k) 
    } 
    sort.Sort(keys) 
    for _, k := range keys { 
     fmt.Printf("short name : %s , long name : %s\n", k.Option, req[k]) 
    } 
} 

type mapKey struct { 
    Key int 
    Option string 
} 

type mapKeys []mapKey 

func (mk mapKeys) Len() int   { return len(mk) } 
func (mk mapKeys) Swap(i, j int)  { mk[i], mk[j] = mk[j], mk[i] } 
func (mk mapKeys) Less(i, j int) bool { return mk[i].Key < mk[j].Key } 

play

Имейте в виду, что если ваш mapKey структура есть поле, которое не поддерживает равенство (ака на структуру или фрагмент) с использованием req[k] не будет работать.

В этом случае вы можете переключиться на type mapKeys []*mapKey и map[*mapKey]string.

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