GoLang基础数据类型---字典
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 := make(map[string]int) personSalary["steve"] = 12000 personSalary["jamie"] = 15000 personSalary["mike"] = 9000 fmt.Println("personSalary map contents:",personSalary) value,ok := personSalary["Tom"] if ok == true { fmt.Println(value) } else { fmt.Println("Tom is not exist") } } 在上面的程序中,第 15 行, Tom is not exist
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 的任何修改都会影响在调用函数中看到。 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) value,ok := personSalary["Tom"] if ok == true { fmt.Println(value) } else { fmt.Println("Tom is not exist") } for k,v := range personSalary { fmt.Println(k,v) } fmt.Println("Len: ",len(personSalary)) delete(personSalary,"mike") for k,len(personSalary)) newPersionSalary := personSalary newPersionSalary["tom"] = 5000 for k,len(newPersionSalary)) for k,v := range newPersionSalary { fmt.Println(k,len(newPersionSalary)) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |