Golang map的多键索引

在大多数的编程语言中,映射容器的键必须以单一值存在。这种映射方法经常被用在诸如信息索引上,如根据通讯簿的名字进行检索。但随着查询条件越来越复杂,检索也会变得越发困难。

代码示例:

package main

import (
	"fmt"
)
type queryKey struct {
	Name string
	Age  int
}
type Profile struct {
	Name    string
	Age     int
	Address string
}
var mapper = make(map[queryKey]*Profile)
func buildIndex(list []*Profile) {
	for _, profile := range list {
		key := queryKey{ //查询的组合键为Name、Age构建的结构体
			Name: profile.Name,
			Age:  profile.Age,
		}
		mapper[key] = profile
	}
}
func queryData(name string, age int) {
	key := queryKey{Name: name, Age: age}
	result, ok := mapper[key]
	if ok {
		fmt.Println(result)
	} else {
		fmt.Println("没有找到对应的数据")
	}

}
func findData(list []*Profile, name string, age int) {
	for _, data := range list {
		if data.Name==name&&data.Age==age {
			fmt.Println(data)
			return
		}
	}
	fmt.Println("没有找到对应的数据")
}
func main() {
	//待查询的数据:
	//数据内容不重复
	list := []*Profile{
		{Name: "张三", Age: 23, Address: "cq"},
		{Name: "李四", Age: 25},
		{Name: "王五"},
	}
	//传统查询
	findData(list, "张三", 23)
	//利用map的多键索引查询(组合键查询)
	buildIndex(list)  //构建基于查询的组合键(name、age)
	queryData("张三", 23) //依据name、age进行查询(多条件)
}

基于map的多键值索引,可以提高查询效率。尤其是在一些对查询时效要求较高的场景,map的多键值索引是一个很好的选择。Go语言中并没有为map提供任何清空所有元素的函数、方法,只提供了

func delete(m map[Type]Type1, key Type)

函数。不用担心垃圾回收的效率,Go语言的并行垃圾回收效率比写一个清空函数高效多了。

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/90377493