Golang教程:(十三)Map
原文:https://golangbot.com/maps/ 这是本Golang系列教程的第十三篇。 什么是 map?Map 是 Go 中的内置类型,它将键与值绑定到一起。可以通过键获取相应的值。 如何创建 map?可以通过将键和值的类型传递给内置函数 personSalary := make(map[string]int)
上面的代码创建了一个名为 map 的 0 值为 nil。试图给一个 nil map 添加元素给会导致运行时错误。因此 map 必须通过 package main
import (
"fmt"
)
func main() {
var personSalary map[string]int
if personSalary == nil {
fmt.Println("map is nil. Going to make one.")
personSalary = make(map[string]int)
}
}
上面的程序中, 向 map 中插入元素插入元素给 map 的语法与数组相似。下面的代码插入一些新的元素给 map package main
import (
"fmt"
)
func main() {
personSalary := make(map[string]int)
personSalary["steve"] = 12000
personSalary["jamie"] = 15000
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:",personSalary)
}
上面的程序输出: 也可以在声明时初始化一个数组: package main
import (
"fmt"
)
func main() {
personSalary := map[string]int {
"steve": 12000,"jamie": 15000,}
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:",personSalary)
}
上面的程序在声明 personSalary map contents: map[steve:12000 jamie:15000 mike:9000]
访问 map 中的元素现在我们已经添加了一些元素给 map,现在让我们学习如何从 map 中提取它们。根据键获取值的语法为: package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
employee := "jamie"
fmt.Println("Salary of",employee,"is",personSalary[employee])
}
上面的程序非常简单。员工 如果一个键不存在会发生什么?map 会返回值类型的 0 值。比如如果访问了 package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,personSalary[employee])
fmt.Println("Salary of joe is",personSalary["joe"])
}
上面的程序输出为: Salary of jamie is 15000
Salary of joe is 0
上面的程序返回 我们如何检测一个键是否存在于一个 map 中呢?可以使用下面的语法: value,ok := map[key]
上面的语法可以检测一个特定的键是否存在于 map 中。如果 package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
newEmp := "joe"
value,ok := personSalary[newEmp]
if ok == true {
fmt.Println("Salary of",newEmp,value)
} else {
fmt.Println(newEmp,"not found")
}
}
在上面的程序中,第 15 行, joe not found
range for 可用于遍历 map 中所有的元素(译者注:这里 range 操作符会返回 map 的键和值)。 package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
fmt.Println("All items of a map")
for key,value := range personSalary {
fmt.Printf("personSalary[%s] = %dn",key,value)
}
}
上面的程序输出如下: All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000
值得注意的是,因为 map 是无序的,因此对于程序的每次执行,不能保证使用 range for 遍历 map 的顺序总是一致的。 删除元素
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
fmt.Println("map before deletion",personSalary)
delete(personSalary,"steve")
fmt.Println("map after deletion",personSalary)
}
上面的程序删除以 map before deletion map[steve:12000 jamie:15000 mike:9000]
map after deletion map[mike:9000 jamie:15000]
map 的大小用内置函数 len 获取 map 的大小: package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
fmt.Println("length is",len(personSalary))
}
上面程序中, map 是引用类型与切片一样,map 是引用类型。当一个 map 赋值给一个新的变量,它们都指向同一个内部数据结构。因此改变其中一个也会反映到另一个: package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,}
personSalary["mike"] = 9000
fmt.Println("Original person salary",personSalary)
newPersonSalary := personSalary
newPersonSalary["mike"] = 18000
fmt.Println("Person salary changed",personSalary)
}
上面的程序中,第 14 行, Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[jamie:15000 mike:18000 steve:12000]
将 map 作为参数传递给函数也是一样的。在函数中对 map 的任何修改都会影响在调用函数中看到。 比较 mapmap 不能通过 package main
func main() {
map1 := map[string]int{
"one": 1,"two": 2,}
map2 := map1
if map1 == map2 {
}
}
上面的程序将会报错:invalid operation: map1 == map2 (map can only be compared to nil)。 比较两个 map 是否相等的方式是一一比较它们的元素是否相等。我会鼓励你为此编写一个程序,使其工作:) 我(原文作者)已经将我们讨论的所有概念编译成单个程序。 你可以从 github下载。 map 的介绍到此结束。感谢阅读。 目录 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |