Go语言基础、实战 -- 5. map

一、map

    1. 简介

        map是Go的内置类型,是键值对(key-value)的形式,不再赘述。

    2. 语法

        map类型的表示语法为:map[KeyType]ValueType

    3. 声明

        可以用普通的声明方式,也可以用速记声明,还可以声明同时初始化,如下:

salary := make(map[string]int)    //速记声明
var salary2 map[string]int        //普通声明

//声明同时初始化
salary3 := map[string]int {
	"Iverson" : 2400,
	"kobe" : 2280,
	"TMAC" : 2300,
}

        map的初始值为nil,对nil map进行操作会导致运行时错误,如果声明时没有初始化,则必须要用make函数创建后或才能使用。

        像上面的第二种方式声明的salary2,如果直接对其进行操作,就会出错,第一个没问题。

    4. 创建map

        Go语言内置的make函数可以用来创建一个map,语法为 make(map[KeyType]ValueType),如下:

var salary2 map[string]int
if salary2 == nil {
	fmt.Println("[salary2 is nil, please Make it]")    //map没有被创建,为nil map
	salary2 = make(map[string]int)
}

        注意:nil并不表示map的元素是否为空,而是表示map是否创建,如果map已被创建,即使没有元素,也不为nil,如下:

salary := make(map[string]int)
if salary != nil {
	fmt.Println("salary is not nil")    //此句被执行,nil并不代码map元素是否为空
}

    5. 插入、访问元素

        直接用赋值的方式向map中插入元素,如下:

salary["James"] = 1800	//插入
salary["James"] = 1900	//修改
salary["Wade"] = 1750
fmt.Println("Salary of James is", salary["James"])        //访问元素
fmt.Println("Salary of Iverson is", salary["Iverson"])    //访问一个不存在的元素,返回value类型的零值

         注意:如果访问了一个不存在的元素,那么会返回该value类型的零值。

    7. 判断是否存在某元素

        语法:value, ok := mapName[Key]

        这样可以检测一个key是否存在于map中,如果存在,ok为true,value被赋上对应的值;若不存在,ok为false,value为该类型的零值,如下:

value, ok := salary["Curry"]
if ok == true {
	fmt.Println("Salary of Curry is", value)
}else {
	fmt.Println("Curry doesn't exist, value is", value)
}

    8. 遍历(排序)

        map也可以用range来遍历,它会返回两个变量,第一个是key,第二个是value,如下:

for k, v:= range salary {
	fmt.Printf("salary[%s] = %d\n", k, v)
}

        注意:map是无序的, 所以每次遍历,顺序可能会不一样。

    9. 删除元素

        语法:delete(mapName, Key)

        若删除了一个不存在的值,不会报错,也不会改变map,如下:

delete(salary, "Wade")        //删除一个存在的元素
delete(salary, "Iverson")     //删除一个不存在的元素

    10. 元素个数

        用内置函数len()获取元素个数。

        语法len(mapName),如下:

fmt.Println("Length of salary is", len(salary))

    11. map是引用类型

        与切片一样,map也是引用类型,故它也有以下特性:

            --当一个map赋值给一个新的map变量,它们都指向同一个底层的数据。因此,改变其中一个对另一个也有影响

            --当map作为函数参数传递时,函数内对map的操作也会影响原map

salary["Curry"] = 500
new_salary := salary
new_salary["Curry"] = 540
fmt.Println(salary)        //Curry的结果为540,因为对new_salary操作也会影响原mapsalary
发布了16 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhounixing/article/details/103704407