Go map 映射/字典

发布时间: 更新时间: 总字数:641 阅读时间:2m 作者: 分享 复制网址

Golang中使用Map来存储一系列的key/value键值对,可以使用key来对value进行操作(增、删、改、查),map的零值为nil。

介绍

Map 的 key 只能为可使用 == 运算符的值类型(字符串、数字、bool、数组),value 可以为任何类型。

说明:

  • key 需要支持等值运算
  • map是无序的,每次遍历的顺序可能都不一样
  • 相关函数
    • 获取长度:len()
    • 删除元素:delete()
  • map是线程不安全的,sync.Map是线程安全的
  • map 可以使用 reflect.DeepEqual 比较

示例

基础使用

package main

import (
	"fmt"
)

func ExampleMap() {
	// 声明
	var ages map[string]int
	fmt.Printf("%T %#v\n", ages, ages)
	fmt.Println(ages == nil) // 默认值为 nil

	// 字面值
	// ages = map[string]int{} // 定义空map
	ages = map[string]int{"xiaowang": 18} // 定义空map
	ages["xiaoming"] = 23
	fmt.Printf("%T %#v\n", ages, ages)

	//ages = make(map[string]int)
	//fmt.Printf("%T %#v\n", ages, ages) //map[string]int map[string]int{}

	// 操作
	fmt.Println(ages["xiaoming"])
	fmt.Println(ages["xianbin"]) // 不存在该值,默认为 int 的零值 0
	// 查
	age, ok := ages["xianbin"] // 判断是否存在,返回两个值,如存在获取 age, true,不存在 0, false
	if ok {
		fmt.Println(age)
	} else {
		fmt.Println("not exist")
	}

	if age, ok := ages["xianbin"]; ok {
		fmt.Println(age)
	} else {
		fmt.Println("not exist")
	}

	// 改
	ages["xiaoming"] = 22
	// 增
	ages["xianbin"] = 18
	fmt.Printf("%T %#v\n", ages, ages)

	// 删除
	delete(ages, "xianbin")
	delete(ages, "bin") // 删除key不存在的值
	fmt.Printf("%T %#v\n", ages, ages)

	// 获取长度
	fmt.Println(len(ages))

	// 遍历数组
	delete(ages, "xiaoming")
	for k, v := range ages {
		fmt.Println(k, v)
	}

	// Output:
	//map[string]int map[string]int(nil)
	//true
	//map[string]int map[string]int{"xiaoming":23, "xiaowang":18}
	//23
	//0
	//not exist
	//not exist
	//map[string]int map[string]int{"xianbin":18, "xiaoming":22, "xiaowang":18}
	//map[string]int map[string]int{"xiaoming":22, "xiaowang":18}
	//2
	//xiaowang 18
}

说明:

  • range map 获取值的情况:
    • 获取key, value:k, v := range map
    • 仅获取key:k := range map
  • 初始化如 {"url": ["seo1", "seo2"]} 格式 map:map[string][]string{}

复合使用

package main

import "fmt"

func ExampleMap() {
	// 映射的映射
	var students map[string]map[string]string
	students = map[string]map[string]string{
		"xiaoming": {"name": "xiaoming", "age": "18", "sex": "boy"}}
	fmt.Printf("%T %#v\n", students, students)

	students["xiaowang"] = map[string]string{"name": "xiaowang", "age": "22", "sex": "boy"}
	fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])

	students["xiaowang"]["age"] = "18"
	fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])

	fmt.Println(students["bin"] == nil)

	if v, ok := students["bin"]; ok {
		fmt.Println("bin is exist", v)
	} else {
		fmt.Println("bin is not exist")
	}

	// 删除
	delete(students["xiaowang"], "age")
	fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])

	delete(students, "xiaowang")
	fmt.Println(students["xiaowang"] == nil)

	// Output:
	//map[string]map[string]string map[string]map[string]string{"xiaoming":map[string]string{"age":"18", "name":"xiaoming", "sex":"boy"}}
	//map[string]string map[string]string{"age":"22", "name":"xiaowang", "sex":"boy"}
	//map[string]string map[string]string{"age":"18", "name":"xiaowang", "sex":"boy"}
	//true
	//bin is not exist
	//map[string]string map[string]string{"name":"xiaowang", "sex":"boy"}
	//true
}
最新评论
加载中...
Home Archives Categories Tags Statistics