Go 映射

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)

实例

此例展示了如何使用 make() 函数在 Go 中创建映射:

package main
import ("fmt")

func main() {
  var a = make(map[string]string) // 映射现在是空的
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"
                                 // a 不再为空
  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() 函数是创建空映射的正确方式。如果您以其他方式创建了空映射并向其写入,将导致 runtime panic。

实例

此例展示了使用 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

亲自试一试

Example Explained

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

映射中不存在 "color" 键。因此,该值为空字符串 ('')。

ok2 变量用于查找键是否存在。因为如果 "color" 键的值为空,我们会得到相同的值。val3 就是这种情况。

映射作为引用

映射是对哈希表的引用。

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

实例

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("更改 b 之后:")

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

结果:

map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang year:1964]
更改 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             // 定义顺序  
  b = append(b, "one", "two", "three", "four")  
  
  for k, v := range a {        // 无序循环  
    fmt.Printf("%v : %v, ", k, v)  
  }  
  
  fmt.Println()  
  
  for _, element := range b {  // 按定义的顺序循环  
    fmt.Printf("%v : %v, ", element, a[element])  
  }  
}

结果:

two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,

亲自试一试