Golang map 字典 映射

优质
小牛编辑
143浏览
2023-12-01

map 翻译过来就是字典或者映射,可以把 map 看做是切片的升级版

  • 切片是用来存储一组相同类型的数据的,map也是用来存储一组相同类型的数据的
  • 在切片中我们可以通过索引获取对应的元素,在 map 中我们可以通过key获取对应的元素
  • 切片的索引是系统自动生成的,从0开始递增,map 中的 key 需要我们自己指定
    • 只要是可以做 ==、!= 判断的数据类型都可以作为 key(数值类型、字符串、数组、指针、结构体、接口)
    • map的key的数据类型不能是:slice、map、function
    • map和切片一样容量都不是固定的,当容量不足时底层会自动扩容

map 格式:var dic map[key数据类型]value数据类型

package main
import "fmt"
func main() {
	var dic map[int]int = map[int]int{0:1, 1:3, 2:5}
	fmt.Println(dic) // map[0:1 1:3 2:5]

	// 获取map中某个key对应的值
	fmt.Println(dic[0]) // 1
	
	// 修改map中某个key对应的值
	dic[1] = 666
	fmt.Println(dic) // map[0:1 1:666 2:5]
}
package main
import "fmt"
func main() {
	var dict map[string]string = map[string]string{"name":"lnj", "age":"33", "gender":"male"}
	fmt.Println(dict)// map[name:lnj age:33 gender:male]
}

创建 map 的三种方式

方式一:通过 Go 提供的语法糖快速创建

package main
import "fmt"
func main() {
	dict  := map[string]string{"name":"lnj", "age":"33", "gender":"male"}
	fmt.Println(dict)// map[name:lnj age:33 gender:male]
}

方式二:通过 make 函数创建 make(类型, 容量)

package main
import "fmt"
func main() {
	var dict = make(map[string]string, 3)
	dict["name"] = "lnj"
	dict["age"] = "33"
	dict["gender"] = "male"
	fmt.Println(dict)// map[age:33 gender:male name:lnj]
}
  • 和切片一样,没有被创建的 map 是不能使用的
package main
import "fmt"
func main() {
	// map声明后不能直接使用, 只有通过make或语法糖创建之后才会开辟空间,才能使用
	var dict map[string]string
	dict["name"] = "lnj" // 编译报错
	dict["age"] = "33"
	dict["gender"] = "male"
	fmt.Println(dict)
}

map 的增删改查

增加:当 map 中没有指定的 key 时就会自动增加

package main
import "fmt"
func main() {
	var dict = make(map[string]string)
	fmt.Println("增加前:", dict) // map[]
	dict["name"] = "lnj"
	fmt.Println("增加后:", dict) // map[name:lnj]
}

修改:当 map 中有指定的 key 时就会自动修改

package main
import "fmt"
func main() {
	var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"}
	fmt.Println("修改前:", dict) // map[name:lnj age:33 gender:male]
	dict["name"] = "zs"
	fmt.Println("修改后:", dict) // map[age:33 gender:male name:zs]
}

删除:可以通过 Go 语言内置 delete 函数删除指定元素

package main
import "fmt"
func main() {
	var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"}
	fmt.Println("删除前:", dict) // map[name:lnj age:33 gender:male]
	// 第一个参数: 被操作的字典
	// 第二个参数: 需要删除元素对应的key
	delete(dict, "name")
	fmt.Println("删除后:", dict) // map[age:33 gender:male]
}

查询:通过 ok-idiom 模式判断指定键值对是否存储

package main
import "fmt"
func main() {
	var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"}
	//value, ok := dict["age"]
	//if(ok){
	//	fmt.Println("有age这个key,值为", value)
	//}else{
	//	fmt.Println("没有age这个key,值为", value)
	//}
	if value, ok := dict["age"]; ok{
		fmt.Println("有age这个key,值为", value)
	}
}

map 遍历

注意:map 和数组以及切片不同,map 中存储的数据是无序的,所以多次打印输出的顺序可能不同

var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"}
for key, value := range dict{
  fmt.Println(key, value)
}