Golang的高级数据类型-字典(map)实战篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
Go语言字典和数组,切片一样,是来保存一组相同的数据类型的。可以通过key键来获取value值,map为映射关系容器,采用散列(hash)实现。
如果数据存在频繁删除操作的话,尽量不要使用切片,map删除数据效率要比切片好,如果数据需要排序,切片和数组比map好,因为map是无序的。
一.字典(map)的定义
package main import ( "fmt" ) func main() { /* 声明字典结构语法如下: var 字典 map[键类型]值类型 定义字典结构使用map关键字,"[]"中指定的是键(key)的类型,后面紧跟着的是值(value)的类型。 温馨提示: map中的key值除了切片,函数,复数(complex)以及包含切片的结构体都可以,换句话说,使用这些类型会造成编译错误。 map在使用前也需要使用make函数进行初始化。 map没有容量属性,map只有长度属性,长度表示的是map中key和value有多少对。 map满足集合的特性,即key是不能重复的 */ //声明一个字典类型 var m1 map[string]string //map在使用前必须初始化空间,和切片类似的是map自身也没有空间哟~ m1 = make(map[string]string) //注意,key和value都是字符串类型 m1["Name"] = "Jason Yin" //注意,上一行已经定义"Name"这个key名称了,再次使用同名key会将上一个key对应的value进行覆盖 m1["Name"] = "尹正杰" fmt.Printf("m1的数据类型是:%T,对应的长度是:%d ", m1, len(m1)) fmt.Println("m1的数据是:", m1) //使用自动推到类型并初始化空间 m2 := make(map[string]int) //注意key是字符串类型,而vlaue是int类型 m2["Age"] = 18 fmt.Printf("m2的数据类型是:%T,对应的长度是:%d ", m2, len(m2)) fmt.Println("m2的数据是:", m2) //直接初始化空间并赋初始值 m3 := map[string]rune{"first": '尹', "second": '正', "third": '杰'} fmt.Printf("m3的数据类型是:%T,对应的长度是:%d ", m3, len(m3)) fmt.Println("m3的数据是:", m3) }
二.字典(map)的基本操作
1>.字典(map)的访问方式(查询)
package main import ( "fmt" ) func main() { m1 := map[string]rune{"first": '尹', "second": '正', "third": '杰'} //第一种访问方式,可以通过key值访问 fmt.Println("===== 第一种访问方式 =====") fmt.Println(m1["first"]) //第二种访问方式,可以通过变量名访问所有数据 fmt.Println("===== 第二种访问方式 =====") fmt.Println(m1) //第三种访问方式,同时拿到key和value fmt.Println("===== 第三种访问方式 =====") for key, value := range m1 { fmt.Println("key值是:", key, ",value值是:", value) } //第四种访问方式,只拿到key,基于key去范围其对应的value fmt.Println("===== 第四种访问方式 =====") for key := range m1 { fmt.Println("key值是:", key, ",value值是:", m1[key]) } //第五种访问方式,判断一个map是否有key,基于返回的bool值做相应的操作 fmt.Println("===== 第五种访问方式 =====") value, flag := m1["first"] if flag { fmt.Println("key的值为:", value) } }
2>.字典(map)的增删改操作
package main import ( "fmt" ) func main() { m1 := map[string]rune{"first": '尹', "second": '正', "third": '杰'} //增加map键值 fmt.Println("增加key之前:", m1) m1["test"] = 666666 fmt.Println("增加key之后:", m1) //更新键值, m1["test"] = 88888888 fmt.Println("更新key之后:", m1) //删除键值,Go语言种delete函数只是删除map种元素的作用 delete(m1, "test") fmt.Println("删除key之后:", m1) }
3>.字典(map)的嵌套
package main import ( "fmt" ) func main() { m1 := map[string]rune{"first": '尹', "second": '正', "third": '杰'} /* 定义一个嵌套数据类型 */ m2 := make(map[string]map[string]int32) //我们可以为嵌套类型赋值 m2["name"] = m1 fmt.Println("m1的数据为:", m1) fmt.Println("m2的数据为:", m2) }
三.字典(map)作为函数参数
package main import ( "fmt" ) func Rename(m map[string]string) { //为传递进来的map增加一个key. m["name"] = "Jason Yin" fmt.Printf("Rename函数中的m地址为:%p ", m) } func main() { /* 在Go语言中,数组作为参数进行传递时值传递,而切片作为参数进行传递时引用传递。 值传递: 方法调用时,实参数把他的值传递给对应的形式参数,方法执行中形式参数值的改变不会影响实际参数的值。 引用传递(也称为传地址): 函数调用时,实际参数的引用(地址,而不是参数的值)被传递给函数中相对应的形式参数(实参与形参指向了同一块存储区域); 在函数执行时,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变会影响实际参数的值。 map作为函数参数传递实际上和切片传递一样,传递的是地址,也就是我们常说的引用传递. 温馨提示: (1)说白了,只要先使用make进行初始化操作再使用的类型,在函数传递时基本上都是引用传递哟~ (2)在我们日常开发中,常见引用传递的高级数据类型有切片,字典(map)和管道(channel). */ m1 := make(map[string]string) fmt.Println("调用前的m1数据为:", m1) fmt.Printf("main函数中的m1地址为:%p ", m1) Rename(m1) fmt.Println("调用后的m1数据为:", m1) }