Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的

定义 Map

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

  1. // 声明变量,默认 map 是 nil
  2. var map_variable map[key_data_type]value_data_type
  3. // 使用 make 函数
  4. map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map, 就不能用来存放键值对

下面实例演示了创建和使用map:

  1. package main
  2. import "fmt"
  3. func main() {
  4. var countryCapitalMap map[string]string //创建集合
  5. countryCapitalMap = make(map[string]string)
  6. // map插入key - value对,各个国家对应的首都
  7. countryCapitalMap [ "France" ] = "巴黎"
  8. countryCapitalMap [ "Italy" ] = "罗马"
  9. countryCapitalMap [ "Japan" ] = "东京"
  10. countryCapitalMap [ "India " ] = "新德里"
  11. //使用键输出地图值
  12. for country := range countryCapitalMap {
  13. fmt.Println(country, "首都是", countryCapitalMap [country])
  14. }
  15. //查看元素在集合中是否存在
  16. capital, ok := countryCapitalMap [ "American" ] //如果确定是真实的,则存在,否则不存在
  17. if (ok) {
  18. fmt.Println("American 的首都是", capital)
  19. } else {
  20. fmt.Println("American 的首都不存在")
  21. }
  22. }
  23. /*
  24. 以上实例运行结果为:
  25. France 首都是 巴黎
  26. Italy 首都是 罗马
  27. Japan 首都是 东京
  28. India 首都是 新德里
  29. American 的首都不存在
  30. */

delete() 函数

delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. // 创建map
  5. countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
  6. fmt.Println("原始地图")
  7. for k,country := range countryCapitalMap {
  8. fmt.Println(country, "首都是:", countryCapitalMap[k])
  9. }
  10. //删除元素
  11. delete(countryCapitalMap, "France")
  12. fmt.Print("\n法国条目被删除\n\n")
  13. fmt.Println("删除元素后地图")
  14. for k := range countryCapitalMap {
  15. fmt.Println(k, "首都是:", countryCapitalMap[k])
  16. }
  17. }
  18. /*
  19. 以上实例运行结果为:
  20. 原始地图
  21. France 首都是: Paris
  22. Italy 首都是: Rome
  23. Japan 首都是: Tokyo
  24. India 首都是: New delhi
  25. 法国条目被删除
  26. 删除元素后地图
  27. Italy 首都是: Rome
  28. Japan 首都是: Tokyo
  29. India 首都是: New delhi
  30. */

基于go实现简单 HashMap,暂未做key值的校验

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type HashMap struct {
  6. key string
  7. value string
  8. hashCode int
  9. next *HashMap
  10. }
  11. var table [16](*HashMap)
  12. func initTable() {
  13. for i := range table{
  14. table[i] = &HashMap{"","",i,nil}
  15. }
  16. }
  17. func getInstance() [16](*HashMap){
  18. if(table[0] == nil){
  19. initTable()
  20. }
  21. return table
  22. }
  23. func genHashCode(k string) int{
  24. if len(k) == 0{
  25. return 0
  26. }
  27. var hashCode int = 0
  28. var lastIndex int = len(k) - 1
  29. for i := range k {
  30. if i == lastIndex {
  31. hashCode += int(k[i])
  32. break
  33. }
  34. hashCode += (hashCode + int(k[i]))*31
  35. }
  36. return hashCode
  37. }
  38. func indexTable(hashCode int) int{
  39. return hashCode%16
  40. }
  41. func indexNode(hashCode int) int {
  42. return hashCode>>4
  43. }
  44. func put(k string, v string) string {
  45. var hashCode = genHashCode(k)
  46. var thisNode = HashMap{k,v,hashCode,nil}
  47. var tableIndex = indexTable(hashCode)
  48. var nodeIndex = indexNode(hashCode)
  49. var headPtr [16](*HashMap) = getInstance()
  50. var headNode = headPtr[tableIndex]
  51. if (*headNode).key == "" {
  52. *headNode = thisNode
  53. return ""
  54. }
  55. var lastNode *HashMap = headNode
  56. var nextNode *HashMap = (*headNode).next
  57. for nextNode != nil && (indexNode((*nextNode).hashCode) < nodeIndex){
  58. lastNode = nextNode
  59. nextNode = (*nextNode).next
  60. }
  61. if (*lastNode).hashCode == thisNode.hashCode {
  62. var oldValue string = lastNode.value
  63. lastNode.value = thisNode.value
  64. return oldValue
  65. }
  66. if lastNode.hashCode < thisNode.hashCode {
  67. lastNode.next = &thisNode
  68. }
  69. if nextNode != nil {
  70. thisNode.next = nextNode
  71. }
  72. return ""
  73. }
  74. func get(k string) string {
  75. var hashCode = genHashCode(k)
  76. var tableIndex = indexTable(hashCode)
  77. var headPtr [16](*HashMap) = getInstance()
  78. var node *HashMap = headPtr[tableIndex]
  79. if (*node).key == k{
  80. return (*node).value
  81. }
  82. for (*node).next != nil {
  83. if k == (*node).key {
  84. return (*node).value
  85. }
  86. node = (*node).next
  87. }
  88. return ""
  89. }
  90. func main() {
  91. getInstance()
  92. put("a","a_put")
  93. put("b","b_put")
  94. put("c","c_put")
  95. fmt.Println(get("a"),get("b"),get("c"))
  96. }
  97. /*
  98. a_put b_put c_put
  99. */