菜单
×
   ❮   
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 Map


Go Map

Map 用于以 key:value 对的形式存储数据值。

Map 中的每个元素都是一个 key:value 对。

Map 是一个无序且可变的集合,不允许重复。

Map 的长度是其元素的数量。您可以使用 len() 函数找到它。

Map 的默认值为 nil。

Map 引用底层哈希表。

Go 提供了多种创建 Map 的方法。


使用 var:= 创建 Map

语法

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

示例

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

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]
自己动手试一试 »

注意:代码中定义的 Map 元素的顺序与它们存储的方式不同。数据以高效检索 Map 的方式存储。



使用 make() 函数创建 Map

语法

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

示例

此示例展示了如何使用 make() 函数在 Go 中创建 Map。

package main
import ("fmt")

func main() {
  var a = make(map[string]string) // Map 现在是空的
  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]
自己动手试一试 »

创建一个空 Map

有两种创建空 Map 的方法。一种是使用 make() 函数,另一种是使用以下语法。

语法

var a map[KeyType]ValueType

注意: make() 函数是创建空 Map 的正确方法。如果您以其他方式创建空 Map 并向其写入数据,则会导致运行时恐慌。

示例

此示例显示了使用 make() 函数和不使用它来声明空 Map 之间的区别。

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
自己动手试一试 »

允许的键类型

Map 键可以是任何定义了相等运算符(==)的数据类型。这些包括

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

无效的键类型为

  • 切片
  • Map
  • 函数

这些类型无效,因为相等运算符(==)未为其定义。


允许的值类型

Map 的值可以是任何类型。


访问 Map 元素

您可以通过以下方式访问 Map 元素

语法

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"])
}

结果

福特
自己动手试一试 »

更新和添加 Map 元素

更新或添加元素的方法是

语法

map_name[key] = value

示例

此示例展示了如何更新和添加 Map 中的元素。

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]
自己动手试一试 »

从 Map 中删除元素

使用 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]
自己动手试一试 »

检查 Map 中的特定元素

您可以使用以下方法检查 Map 中是否存在某个键

语法

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
自己动手试一试 »

示例解释

在此示例中,我们检查了 Map 中不同键的存在性。

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

ok2 变量用于判断键是否存在。因为即使 "color" 键的值为空,我们也会得到相同的值。val3 的情况也是如此。


Map 是引用

Map 是哈希表的引用。

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

示例

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]
更改 b 后
map[brand:Ford model:Mustang year:1970]
map[brand:Ford model:Mustang year:1970]
自己动手试一试 »

遍历 Map

您可以使用 range 来遍历 Map。

示例

此示例展示了如何遍历 Map 中的元素。请注意输出中元素的顺序。

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,
自己动手试一试 »

按特定顺序遍历 Map

Map 是无序数据结构。如果您需要按特定顺序遍历 Map,则必须有一个单独的数据结构来指定该顺序。

示例

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,
自己动手试一试 »

×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持