Go 映射
Go 映射
映射(Map)用于以键值对的形式存储数据值。
映射中的每个元素都是一个键值对。
映射是一个无序且可变的集合,不允许重复。
映射的长度是其元素的数量。您可以使用 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)
实例
此例展示了如何使用 make()
函数在 Go 中创建映射:
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()
函数是创建空映射的正确方式。如果您以其他方式创建了空映射并向其写入,将导致 runtime panic。
实例
此例展示了使用 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
Example Explained
在此例中,我们检查映射中是否存在不同的键。
映射中不存在 "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,