Skip to content

map 映射表

这是一个键值对的集合。

类型:map[keyType]valueType{}

使用 make 创建和初始化。

go
type Vertex struct {
	Lat, Long float64
}
func main() {
	m = make(map[string]Vertex)
	m["Bell Labs"] = Vertex{
		40.68433, -74.39967,
	}
	fmt.Println(m["Bell Labs"])
}

示例

一个键值对类型,键和值都可以为任意类型。

go
package main

import "fmt"

type Vertex struct {
	Lat, Long float64
}

var m = map[string]Vertex{
	"Bell Labs": Vertex{
		40.68433, -74.39967,
	},
	"Google": Vertex{
		37.42202, -122.08408,
	},
}

func main() {
	fmt.Println(m)
}

运行结果:

map[Bell Labs:{40.68433 -74.39967} Google:{37.42202 -122.08408}]

忽视顶层类型名

go
var m = map[string]Vertex{
	"Bell Labs": {40.68433, -74.39967}, // 值的类型名在代码里被忽略了
	"Google":    {37.42202, -122.08408},
}

零值

map 的零值为 nil。零值 map 没有任何东西,也不能往里面加入东西。

修改/读取映射

插入或修改元素:m[key] = elem

获取元素:elem = m[key]

删除元素:delete(m, key)

通过双赋值检测某个键是否存在,返回ok内的结果为true/false:elem, ok = m[key]

注:若 elem 或 ok 还未声明,你可以使用短变量声明: elem, ok := m[key]

go
func main() {
	m := make(map[string]int)

	m["答案"] = 42
	fmt.Println("值:", m["答案"])

	m["答案"] = 48
	fmt.Println("值:", m["答案"])

	delete(m, "答案")
	fmt.Println("值:", m["答案"])

	v, ok := m["答案"]
	fmt.Println("值:", v, "是否存在?", ok)
}

运行结果:

值: 42
值: 48
值: 0
值: 0 是否存在? false