Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Go 地图


Go 地图

地图用于存储键值对形式的数据值。

地图中的每个元素都是一个键值对。

地图是一种无序且可变的集合,不允许重复。

地图的长度是其元素的数量。您可以使用 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 中使用 make() 函数创建地图。

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() 函数是创建空地图的正确方法。如果您以其他方式创建空地图并写入它,则会导致运行时恐慌。

示例

此示例展示了使用 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" // 更新元素
  a["color"] = "red" // 添加元素

  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"] // 检查现有键及其值
  val2, ok2 := a["color"] // 检查不存在的键及其值
  val3, ok3 := a["day"]   // 检查现有键及其值
  _, ok4 := a["model"]    // 仅检查现有键,不检查其值

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

结果

Ford true
 false
 true
true
自己尝试 »

示例说明

在此示例中,我们检查了地图中是否存在不同的键。

键 "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,
自己尝试 »

×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.