menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 08.6.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    08.6.md
    1.74 KB / 2024-07-16 23:14:27
        # 8.6 将 map 的键值对调
    
    这里对调是指调换 key 和 value。如果 `map` 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。
    
    示例 8.7 [invert_map.go](examples/chapter_8/invert_map.go):
    
    ```go
    package main
    import (
    	"fmt"
    )
    
    var (
    	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
    							"delta": 87, "echo": 56, "foxtrot": 12,
    							"golf": 34, "hotel": 16, "indio": 87,
    							"juliet": 65, "kili": 43, "lima": 98}
    )
    
    func main() {
    	invMap := make(map[int]string, len(barVal))
    	for k, v := range barVal {
    		invMap[v] = k
    	}
    	fmt.Println("inverted:")
    	for k, v := range invMap {
    		fmt.Printf("Key: %v, Value: %v / ", k, v)
    	}
    }
    ```
    
    输出结果:
    
    	inverted:
    	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`,比如使用 `map[int][]string` 类型。
    
    **练习 8.2** [map_drinks.go](exercises/chapter_8/map_drinks.go)
    
    构造一个将英文饮料名映射为法语(或者任意你的母语)的集合;先打印所有的饮料,然后打印原名和翻译后的名字。接下来按照英文名排序后再打印出来。
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[map 的排序](08.5.md)
    - 下一章:[包 (package)](09.0.md)
    
    
    links
    file_download