这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。

    示例 8.7 invert_map.go

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. var (
    6. barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
    7. "delta": 87, "echo": 56, "foxtrot": 12,
    8. "golf": 34, "hotel": 16, "indio": 87,
    9. "juliet": 65, "kili": 43, "lima": 98}
    10. )
    11. func main() {
    12. invMap := make(map[int]string, len(barVal))
    13. for k, v := range barVal {
    14. invMap[v] = k
    15. }
    16. fmt.Println("inverted:")
    17. for k, v := range invMap {
    18. fmt.Printf("Key: %v, Value: %v / ", k, v)
    19. }
    20. }

    输出结果:

    1. inverted:
    2. Key: 34, Value: golf / Key: 23, Value: charlie / Key: 16, Value: hotel / Key: 87, Value: delta / Key: 98, Value: lima / Key: 12, Value: foxtrot / Key: 43, Value: kili / Key: 56, Value: bravo / Key: 65, Value: juliet /

    如果原始 value 值不唯一那么这么做肯定会出错;为了保证不出错,当遇到不唯一的 key 时应当立刻停止,这样可能会导致没有包含原 map 的所有键值对!一种解决方法就是仔细检查唯一性并且使用多值 map,比如使用 map[int][]string 类型。

    练习 8.2

    构造一个将英文饮料名映射为法语(或者任意你的母语)的集合;先打印所有的饮料,然后打印原名和翻译后的名字。接下来按照英文名排序后再打印出来。