slice和map的区别
slice是数组的形式,map是哈希的key、value形式类似于python中的列表和字典的关系。
声明map
第一种声明方式(先声明,再分配,再赋值)
package main
import "fmt"
func main() {
// 声明一个map,它的key为string类型,value是string类型
var myMap1 map[string]string
if myMap1 == nil {
fmt.Println("myMap1是一个空map")
}
// 在使用map前,需要先用make给map分配数据空间,因为无法调用空的map
myMap1 = make(map[string]string, 10)
// 赋值
myMap1["one"] = "python"
myMap1["two"] = "c"
myMap1["three"] = "php"
fmt.Println(myMap1)
}
运行结果:
可以看到打印出来的map看起来是乱序的,原因存在于map的排序采用了对key使用hash算法。
第二种声明方式(声明并且分配,再赋值)
myMap2 := make(map[int]string) // 将声明和分配空间合并在一起,并且可以省略分配的容量,让其自动分配
// 赋值
myMap2[1] = "python"
myMap2[2] = "c"
myMap2[3] = "php"
fmt.Println(myMap2)
第三种声明方式(声明分配赋值一起)
myMap3 := map[string] string {
"one": "php",
"two": "java",
"three": "c++",
}
fmt.Println(myMap3)
使用map
增删改查
cityMap := make(map[string]string)
// 赋值
cityMap["China"] = "Beijing"
cityMap["Japan"] = "Tokyo"
cityMap["USA"] = "NewYork"
// 遍历
for key, value := range cityMap {
fmt.Println("key = ",key)
fmt.Println("value = ",value)
}
// 删除
delete(cityMap, "China") // delete函数,第一个参数为操作的对象,第二个参数为key
// 修改
cityMap["USA"] = "我心疼DC"
fmt.Println("==================")
// 遍历
for key, value := range cityMap{
fmt.Println("key = ",key)
fmt.Println("value = ",value)
}
map作为函数的参数
package main
import "fmt"
func printMap(cityMap map[string]string) {
// 是引用传递,传递的是指针
for key, value := range cityMap{
fmt.Println("key = ",key)
fmt.Println("value = ",value)
}
}
func main() {
cityMap := make(map[string]string)
// 赋值
cityMap["China"] = "Beijing"
cityMap["Japan"] = "Tokyo"
cityMap["USA"] = "NewYork"
// 遍历
printMap(cityMap)
// 删除
delete(cityMap, "China") // delete函数,第一个参数为操作的对象,第二个参数为key
// 修改
cityMap["USA"] = "我心疼DC"
fmt.Println("==================")
// 遍历
printMap(cityMap)
}
- 2-10行声明函数,将map作为参数,用来遍历map中的元素
- 第20、第30行调用遍历的函数,cityMap作为参数
运行结果:
可以看到遍历函数打印了cityMap中的元素。
注意:这里的函数传递的map参数是引用传递,也就是指针指向同一个内存空间,可以在函数内部修改外部传入的map中的值。
如果要实现深拷贝,新声明一个map然后使用for循环依次将元素赋值到新map中即可。
此处评论已关闭