Go Map


Go Map

映射用于以键:值对的形式存储数据值。

映射中的每个元素都是一个键:值对。

地图是一个无序且可更改的集合,不允许重复。

映射的长度是其元素的数量。您可以使用以下方式找到它len()功能。

映射的默认值为 nil。

映射保存对基础哈希表的引用。

Go 有多种创建地图的方法。


使用创建地图var:=

语法

var a = map[KeyType]ValueType{ key1: value1, key2: value2,...}
b := map[KeyType]ValueType{ key1: value1, key2: value2,...}

示例

此示例展示了如何在 Go 中创建地图。注意代码和输出中的顺序

package main
import ("fmt")

func main() {
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
  b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}

  fmt.Printf("a\t%v\n", a)
  fmt.Printf("b\t%v\n", b)
}

结果:

a   map[brand:Ford model:Mustang year:1964]
b   map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
亲自试一试 »

笔记:代码中定义的地图元素的顺序与其存储方式不同。数据的存储方式可以从地图中进行有效的数据检索。



使用创建地图make()功能:

语法

var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)

示例

此示例展示了如何使用 Go 在 Go 中创建地图make()功能。

package main
import ("fmt")

func main() {
  var a = make(map[string]string) // The map is empty now
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"
                                  // a is no longer empty
  b := make(map[string]int)
  b["Oslo"] = 1
  b["Bergen"] = 2
  b["Trondheim"] = 3
  b["Stavanger"] = 4

  fmt.Printf("a\t%v\n", a)
  fmt.Printf("b\t%v\n", b)
}

结果:

a   map[brand:Ford model:Mustang year:1964]
b   map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
亲自试一试 »

创建一个空地图

有两种方法可以创建空地图。一种是通过使用make()函数,另一个是使用以下语法。

语法

var a map[KeyType]ValueType

笔记:这个make()函数是创建空地图的正确方法。如果您以不同的方式创建一个空映射并对其进行写入,则会导致运行时恐慌。

示例

此示例显示了使用 和 声明空映射之间的区别make()功能和没有它。

package main
import ("fmt")

func main() {
  var a = make(map[string]string)
  var b map[string]string

  fmt.Println(a == nil)
  fmt.Println(b == nil)
}

结果:

false
true
亲自试一试 »

允许的密钥类型

映射键可以是等于运算符 (==) 被定义为。这些包括:

  • 布尔值
  • 数字
  • 字符串
  • 数组
  • 指针
  • 结构体
  • 接口(只要动态类型支持相等)

无效的密钥类型有:

  • 切片
  • 地图
  • 函数

这些类型无效,因为相等运算符 (==) 没有为它们定义。


允许的值类型

地图值可以是任何类型。


访问地图元素

您可以通过以下方式访问地图元素:

语法

value = map_name[key]

示例

package main
import ("fmt")

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Printf(a["brand"])
}

结果:

Ford
亲自试一试 »

更新和添加地图元素

更新或添加元素是通过以下方式完成的:

语法

map_name[key] = value

示例

此示例演示如何更新元素并向地图添加元素。

package main
import ("fmt")

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  a["year"] = "1970" // Updating an element
  a["color"] = "red" // Adding an element

  fmt.Println(a)
}

结果:

map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]
亲自试一试 »

从地图中删除元素

删除元素是使用delete()功能。

语法

delete( map_name, key)

示例

package main
import ("fmt")

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  delete(a,"year")

  fmt.Println(a)
}

结果:

map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang]
亲自试一试 »

检查地图中的特定元素

您可以使用以下命令检查映射中是否存在某个键:

语法

val, ok := map_name[key]

如果只想检查某个键是否存在,可以使用空白标识符(_) 代替 val。

示例

package main
import ("fmt")

func main() {
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day":""}

  val1, ok1 := a["brand"]  // Checking for existing key and its value
  val2, ok2 := a["color"]  // Checking for non-existing key and its value
  val3, ok3 := a["day"]    // Checking for existing key and its value
  _, ok4 := a["model"]     // Only checking for existing key and not its value

  fmt.Println(val1, ok1)
  fmt.Println(val2, ok2)
  fmt.Println(val3, ok3)
  fmt.Println(ok4)
}

结果:

Ford true
 false
 true
true
亲自试一试 »

示例解释

在此示例中,我们检查映射中是否存在不同的键。

key 颜色 地图中不存在。因此该值为空字符串 ('')。

这个好的2变量用于确定键是否存在。因为如果 "color" 键的值为空,我们会得到相同的值。情况是这样的值3


地图作为参考

映射是对哈希表的引用。

如果两个映射变量引用同一个哈希表,则更改一个变量的内容会影响另一个变量的内容。

示例

package main
import ("fmt")

func main() {
  var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
  b := a

  fmt.Println(a)
  fmt.Println(b)

  b["year"] = "1970"
  fmt.Println("After change to b:")

  fmt.Println(a)
  fmt.Println(b)
}

结果:

map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang year:1964]
After change to b:
map[brand:Ford model:Mustang year:1970]
map[brand:Ford model:Mustang year:1970]
亲自试一试 »

迭代地图

您可以使用range迭代地图。

示例

此示例演示如何迭代映射中的元素。请注意输出中元素的顺序。

package main
import ("fmt")

func main() {
  a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}

  for k, v := range a {
    fmt.Printf("%v : %v, ", k, v)
  }
}

结果:

two : 2, three : 3, four : 4, one : 1,
亲自试一试 »

按特定顺序迭代映射

地图是无序的数据结构。如果需要按特定顺序迭代映射,则必须有一个单独的数据结构来指定该顺序。

示例

package main
import ("fmt")

func main() {
  a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}

  var b []string              // defining the order
  b = append(b, "one", "two", "three", "four")

  for k, v := range a {         // loop with no order
    fmt.Printf("%v : %v, ", k, v)
  }

  fmt.Println()

  for _, element := range b {   // loop with the defined order
    fmt.Printf("%v : %v, ", element, a[element])
  }
}

结果:

two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,
亲自试一试 »