关于go:Go-Maps

61次阅读

共计 4003 个字符,预计需要花费 11 分钟才能阅读完成。

Maps 用于以键值对的模式存储数据值。Maps 中的每个元素都是一个键值对。Maps 是一个无序且可更改的汇合,不容许反复。Maps 的长度是其元素的数量。您能够应用 len() 函数来查找长度。Maps 的默认值是 nil。Maps 保留对底层哈希表的援用。

Go 语言有多种办法来创立 Maps。

应用 var 和 := 语法创立 Maps

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

示例

以下示例展现了如何在 Go 中创立 Maps。请留神代码中和输入中的程序。

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]

留神:代码中定义的 Maps 元素的程序与它们存储的形式不同。数据以一种可能从 Maps 中高效检索数据的形式存储。

应用 make() 函数创立 Maps

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

示例

以下示例展现了如何应用 make() 函数在 Go 中创立 Maps。

package main
import ("fmt")

func main() {var a = make(map[string]string) // Maps 当初为空   
  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]

创立一个空 Maps

创立空 Maps 有两种形式。一种是应用 make() 函数,另一种是应用以下语法。

var a map[KeyType]ValueType

留神:应用 make() 函数是创立空 Maps 的正确形式。如果以不同的形式创立空 Maps 并写入它,将会引发运行时谬误。

示例

以下示例演示了应用 make() 函数和不应用 make() 函数申明空 Maps 的区别。

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

容许的键类型

Maps 键能够是任何定义了等号运算符(==)的数据类型,包含:

  • 布尔值
  • 数字
  • 字符串
  • 数组
  • 指针
  • 构造体
  • 接口(只有动静类型反对等号运算)

不容许的键类型包含:

  • 切片
  • Maps
  • 函数

这些类型是不容许的,因为它们不反对等号运算(==)。

容许的值类型

Maps 的值能够是任何类型。

拜访 Maps 元素

您能够通过以下形式拜访 Maps 元素:

value = map_name[key]

示例

以下示例演示了如何拜访 Maps 元素。

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

更新和增加 Maps 元素

要更新或增加元素,能够应用以下形式:

map_name[key] = value

示例

以下示例演示了如何更新和增加元素到 Maps 中。

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]

从 Maps 中删除元素删除元素应用 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]

查看 Maps 中特定元素的存在 您能够应用以下语法查看 Maps 中是否存在特定键:

语法 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

Maps 是援用 Maps 是对哈希表的援用。

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

示例

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]

遍历 Maps 您能够应用 range 来遍历 Maps。

示例 以下示例显示了如何遍历 Maps 中的元素。请留神输入中元素的程序。

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,

按特定程序遍历 Maps。Maps 是无序的数据结构。如果须要按特定程序遍历 Maps,则必须应用独自的数据结构来指定该程序。

示例 以下示例演示了如何按特定程序遍历 Maps 中的元素。

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,

最初

为了不便其余设施和平台的小伙伴观看往期文章,链接奉上:

公众号搜寻 Let us Coding 知乎 开源中国 CSDN 思否 掘金 InfoQ 简书 博客园 慕课 51CTOhelloworld 腾讯开发者社区 阿里开发者社区

看完如果感觉有帮忙,欢送 点赞、珍藏 关注

正文完
 0