映射用于以键:值对的形式存储数据值。
映射中的每个元素都是一个键:值对。
地图是一个无序且可更改的集合,不允许重复。
映射的长度是其元素的数量。您可以使用以下方式找到它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 在 Go 中创建地图make()
功能。
package main
import ("fmt")
func main() {
var a = make(map[string]string)
// The map is empty now
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
// a is no longer empty
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"
// 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
在此示例中,我们检查映射中是否存在不同的键。
key 颜色 地图中不存在。因此该值为空字符串 ('')。
这个好的2变量用于确定键是否存在。因为如果 "color" 键的值为空,我们会得到相同的值。情况是这样的值3。
映射是对哈希表的引用。
如果两个映射变量引用同一个哈希表,则更改一个变量的内容会影响另一个变量的内容。
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]
After change to 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
// defining the order
b = append(b, "one", "two", "three", "four")
for k, v := range a {
// loop with no order
fmt.Printf("%v : %v, ", k, v)
}
fmt.Println()
for _, element := range b {
// loop with the defined order
fmt.Printf("%v : %v, ", element, a[element])
}
}
结果:
two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,