Golang之映射

映射

映射是一系列无序的k/v对,可以通过key来对value进行操作,key的值只能为:字符串、数字、布尔、数组,value可以为任意类型

映射的声明

map声明需要指定组成元素key和value的类型,初始值为nil


package main

import "fmt"

func main() {
	var nums map[string]int8
	fmt.Println("%T,%#v,", nums, nums, nums == nil)
}

go run map.go
map[] map[] true

映射的初始化

  1. 使用字面量初始化:map[keytype]valuetype{k1:v1…}
  2. 使用字面量初始化空映射:map[keytype]valuetype{}
  3. 使用make函数初始化:make(map[keytype]vlauetype)

package main

import "fmt"

func main() {
	tels := map[string]string{"a": "1", "b": "2"}
	fmt.Printf("%#v\n", tels) // map[string]string{"a":"1", "b":"2"}
	a := map[string]int{"a": 100, "b": 200}
	fmt.Println(a) // map[a:100 b:200]

	b := map[string]int8{}
	fmt.Println(b) // map[] 注意与 map[string]int8 的区别

	c := make(map[string]float64)
	fmt.Println(c)
}

映射的操作

package main

import "fmt"

func main() {
	test := map[string]string{"a": "1", "b": "2"}
	// fmt.Printf("%#v\n", tels) // map[string]string{"a":"1", "b":"2"}

	// a := map[string]int{"a": 100, "b": 200}
	// fmt.Println(a) // map[a:100 b:200]

	// b := map[string]int8{}
	// fmt.Println(b) // map[] 注意与 map[string]int8 的区别

	// c := make(map[string]float64)
	// fmt.Println(c)

	// 获取元素的数量,使用len
	fmt.Println(len(test)) // 2

	// 访问,当访问的key存在时,返回对应的值,否则返回值类型的零值
	fmt.Printf("%#v", test["e"])                 // ""
	fmt.Println(test["a"], test["b"], test["c"]) // 1 2

	// 判断 key 是否存在
	// 通过 key 访问元素时可接收两个值,第一个值为 value,第二个值为 bool类型
	// 表示元素是否存在,若存在为 true,否则为 false
	test1, status := test["x"]
	fmt.Printf("%#v, %#v\n", test1, status) // "", false

	// 修改&增加
	// 使用 key 对映射赋值时当 key 存在则修改 key 对应的 value,若 key 不存在则增加 key 和 value
	test["a"] = "100" // 存在
	test["x"] = "200" // 不存在

	fmt.Printf("%#v\n", test) // map[string]string{"a":"100", "b":"2", "x":"200"}

	// 删除 使用delete 函数删除映射中已经存在的 key
	delete(test, "x")
	fmt.Printf("%#v\n", test) // map[string]string{"a":"100", "b":"2"}

	// 遍历 可通过 for-range 对映射中个元素进行遍历,range 返回两个元素分别为映射的 key 和 value
	for k, v := range test {
		fmt.Printf("%v:%v\n", k, v)
	} // a:100  b:2
}