Go Maps 集合
Go Maps 集合
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) // 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]
创建一个空Maps 集合
有两种方法可以创建空Maps 集合。 一种是使用 make()
函数,另一种是使用以下语法。
语法
var a map[KeyType]ValueType
注意: make()
函数是创建空Maps 集合的正确方法。 如果您以不同的方式制作空Maps 集合并对其进行写入,则会导致运行时恐慌。
实例
此示例显示了使用 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
允许的键类型
映射键可以是定义了相等运算符 (==
) 的任何数据类型。 其中包括:
- 布尔值
- 数字
- 字符串
- 数组
- 指针
- 结构
- 接口(只要动态类型支持相等)
无效的键类型是:
- Slices
- Maps
- Functions
这些类型无效,因为没有为它们定义相等运算符 (==
)。
允许的值类型
Maps 集合值可以是任何类型。
访问Maps 集合元素
您可以通过以下方式访问Maps 集合元素:
语法
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
更新和添加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]
如果只想检查某个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 集合中不存在键"color"。 所以值是一个空字符串('')。
ok2 变量用于判断键是否存在。 因为如果"color"键的值为空,我们将得到相同的值。 val3 就是这种情况。
Maps Are References
映射是对哈希表的引用。
如果两个映射变量引用同一个哈希表,改变一个变量的内容会影响另一个变量的内容。
实例
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[Year:1970 brand:Ford model:Mustang year:1964]
map[Year:1970 brand:Ford model:Mustang year:1964]
遍历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 集合,则必须有一个单独的数据结构来指定该顺序。
实例
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,