在本教程中,您将了解什么是map数据类型以及何时在Golang中使用它。

映射是一种数据结构,它为您提供键/值对的无序集合(映射有时也称为PHP中的关联数组、Java中的哈希表或Python中的字典)。映射用于通过其关联的键查找值。您可以基于键将值存储到映射中。

映射的优势在于它能够根据键快速检索数据。键的工作方式类似于索引,指向与该键关联的值。

映射是使用哈希表实现的,哈希表提供了对数据元素的更快查找,您可以通过提供键轻松检索值。映射是无序集合,无法预测键/值对的返回顺序。对映射的每次迭代都可能返回不同的顺序。

 

map初始化

在Golang中,地图是用大括号写的,它们有键和值。

package main
 
import "fmt"
 
var employee = map[string]int{"Mark": 10, "Sandy": 20}
 
func main() {
	fmt.Println(employee)
}

 

空map声明

创建将字符串作为键类型且int作为值类型的员工map

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{}
	fmt.Println(employee)        // map[]
	fmt.Printf("%T\n", employee) // map[string]int
}

 

使用make函数进行map声明

make函数将映射的类型作为参数,并返回初始化的映射。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
	fmt.Println(employee)
 
	employeeList := make(map[string]int)
	employeeList["Mark"] = 10
	employeeList["Sandy"] = 20
	fmt.Println(employeeList)
}

 

map长度

要确定map有多少项(键值对),请使用内置的len()函数。len()函数将为未初始化的映射返回零。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
 
	employeeList := make(map[string]int)
 
	fmt.Println(len(employee))     // 2
	fmt.Println(len(employeeList)) // 0
}

 

访问元素

您可以通过引用map的键名称(在方括号内)来访问map的项目。

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
 
	fmt.Println(employee["Mark"])
}

 

添加元素

通过使用新的索引键并为其分配值,可以将项添加到map中。

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
	fmt.Println(employee)
 
	employee["Rocky"] = 30
	employee["Josef"] = 40
 
	fmt.Println(employee)
}

 

更新值

您可以通过引用特定项的键名称来更新其值。

将mark更改为50

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
	fmt.Println(employee)
 
	employee["Mark"] = 50
	fmt.Println(employee)
}

 

删除元素

内置的delete()函数从与提供的键关联的给定map中删除项目。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
	employee["Rocky"] = 30
	employee["Josef"] = 40
 
	fmt.Println(employee)
 
	delete(employee, "Mark")
	fmt.Println(employee)
}

 

遍历map

for…range循环语句可用于获取映射的索引和元素。

每次迭代返回一个键及其相关元素内容。

package main
 
import "fmt"
 
func main() {
    var employee = map[string]int{"Mark": 10, "Sandy": 20,
        "Rocky": 30, "Rajiv": 40, "Kate": 50}
    for key, element := range employee {
        fmt.Println("Key:", key, "=>", "Element:", element)
    }
}

 

清空map

有两种方法可以从map中清除所有项目。

package main
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20,
		"Rocky": 30, "Rajiv": 40, "Kate": 50}
 
	// 方法1
	for k := range employee {
		delete(employee, k)
	}
 
	// 方法2
	employee = make(map[string]int)
}

 

对map键进行排序

创建的键切片,用于存储映射的键值,然后对切片进行排序。用于按键顺序打印地图值的排序切片。

package main
 
import (
	"fmt"
	"sort"
)
 
func main() {
	unSortedMap := map[string]int{"India": 20, "Canada": 70, "Germany": 15}
 
	keys := make([]string, 0, len(unSortedMap))
 
	for k := range unSortedMap {
		keys = append(keys, k)
	}
	sort.Strings(keys)
 
	for _, k := range keys {
		fmt.Println(k, unSortedMap[k])
	}
}

 

对map值进行排序

要对map的键值进行排序,您需要将它们存储在切片中,然后对切片进行排序。

package main
 
import (
	"fmt"
	"sort"
)
 
func main() {
	unSortedMap := map[string]int{"India": 20, "Canada": 70, "Germany": 15}
 
	values := make([]int, 0, len(unSortedMap))
 
	for _, v := range unSortedMap {
		values = append(values, v)
	}
 
	sort.Ints(values)
 
	for _, v := range values {
		fmt.Println(v)
	}
}

 

合并map

package main
 
import "fmt"
 
func main() {
	first := map[string]int{"a": 1, "b": 2, "c": 3}
	second := map[string]int{"a": 1, "e": 5, "c": 3, "d": 4}
 
	for k, v := range second {
		first[k] = v
	}
 
	fmt.Println(first)
}