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,简书,博客园,慕课,51CTO,helloworld,腾讯开发者社区,阿里开发者社区
看完如果感觉有帮忙,欢送点赞、珍藏和关注
发表回复