Golang 使用struct作为map键
在Golang中, map 是一组无序的键值对集合。它被广泛使用,因为它提供了快速的查找和可以通过键检索,更新或删除的值。
语法:
map[Key_Type]Value_Type{}
例如:var sample map[string]int
这里的sample是一个map,它的键是字符串,值的类型为整数。
在maps中,大多数数据类型都可以用作键,如int、string、float64、rune等。Maps还允许使用struct作为键。这些struct应该彼此比较。Golang中的结构体或 struct 是允许将不同类型的字段组合成单一类型的用户定义类型。
结构体示例:
type Student struct {
name string
rollno int
class string
city string
}
让我们看看如何在map中实现struct:
示例1:
// Golang程序,展示如何使用struct作为map键的
//导入所需包
package main
import "fmt"
//声明一个struct
type Address struct {
Name string
city string
Pincode int
}
func main() {
// 创建struct实例
a2 := Address{Name: "Ram", city: "Delhi", Pincode: 2400}
a1 := Address{"Pam", "Dehradun", 2200}
a3 := Address{Name: "Sam", city: "Lucknow", Pincode: 1070}
// 声明一个map
var mp map[Address]int
// 检查map是否为空
if mp == nil {
fmt.Println("True")
} else {
fmt.Println("False")
}
// 用map字面值声明并初始化
sample := map[Address]int{a1: 1, a2: 2, a3: 3}
fmt.Println(sample)
}
输出:
True
map[{Pam Dehradun 2200}:1 {Ram Delhi 2400}:2 {Sam Lucknow 1070}:3]
遍历一个map: 您还可以运行循环以单独访问和操作每个map键。
示例2:
// Golang程序,展示如何使用struct作为map键的
//导入所需包
package main
import "fmt"
//声明一个struct
type Address struct {
Name string
city string
Pincode int
}
func main() {
// 创建struct实例
a1 := Address{"Pam", "Mumbai", 2200}
a2 := Address{Name: "Ram", city: "Delhi", Pincode: 2400}
a3 := Address{Name: "Sam", city: "Lucknow", Pincode: 1070}
// 用map字面值声明并初始化
sample := map[Address]int{a1: 1, a2: 2, a3: 3}
for str, val := range sample {
fmt.Println(str, val)
}
//使用循环同时访问struct字段
for str := range sample {
fmt.Println(str.Name)
}
}
输出:
{Ram Delhi 2400} 2
{Sam Lucknow 1070} 3
{Pam Mumbai 2200} 1
Pam
Ram
Sam
在map中添加键值对: 在map中添加键值对使用以下语法:
map_name[struct_instance]=value
如果在map中已经存在一个键值对,它将使用新的键值对更新旧的键值对。
示例3:
//在map中添加键值对
package main
//导入所需的包
import "fmt"
//声明结构体
type Student struct {
Name string
rollno int
course string
}
func main() {
//创建结构实例
a1 := Student{"Asha", 1, "CSE"}
a2 := Student{"Aishwarya", 1, "ECE"}
a3 := Student{"Priya", 2, "MECH"}
//使用map字面量声明和初始化
mp := map[Student]int{a1: 1, a2: 2}
fmt.Println("原始map是", mp)
mp[a3] = 3
mp[Student{"Ram", 3, "CSE"}] = 4
//值具有它们的零值
//这里初始值为0,增加后变为1
mp[Student{"Tina", 44, "EEE"}]++
fmt.Println("在map中添加键值对后,更新的map是:", mp)
}
输出:
原始map是 map[{Aishwarya 1 ECE}:2 {Asha 1 CSE}:1]
在map中添加键值对后,更新的map是: map[{Aishwarya 1 ECE}:2 {Asha 1 CSE}:1 {Priya 2 MECH}:3 {Ram 3 CSE}:4 {Tina 44 EEE}:1]
从map中删除一个结构体键: 你可以使用delete()函数从map中删除一个结构体键。它是一个内置函数,不返回任何值,如果给定的map中不存在键,则不执行任何操作。其语法如下:
//在map中删除键值对
delete(map_name, struct_key)
示例4:
//在map中删除键值对
package main
//导入所需的包
import "fmt"
//声明结构体
type Student struct {
Name string
rollno int
course string
}
func main() {
//创建结构实例
a1 := Student{"Asha", 1, "CSE"}
a2 := Student{"Aishwarya", 1, "ECE"}
a3 := Student{"Priya", 2, "MECH"}
a4 := Student{"Ram", 3, "CSE"}
//使用map字面量声明和初始化
mp := map[Student]int{a1: 1, a2: 2, a3: 3, a4: 4}
delete(mp, a4)
fmt.Println("删除后剩余的map:")
for str, i := range mp {
fmt.Println(str, "=", i)
}
}
输出:
删除后剩余的map:
{Asha 1 CSE} = 1
{Aishwarya 1 ECE} = 2
{Priya 2 MECH} = 3
检查键值对的存在性: 你可以检查map中是否存在一个结构体。下面是检查map中是否存在struct_key:value的语法:
//这将给出值和检查结果
//如果检查结果为True,则表示该键存在
//如果检查结果为False,则表示该键缺失,在这种情况下,值采用零值
value, check_variable_name:= map_name[key]或
//不使用值,只使用空标识符
//它只会给出检查结果
_, check_variable_name:= map_name[key]
示例6:
// 检查结构体键是否存在的 Golang 程序
package main
// 导入所需的包
import "fmt"
// 声明一个结构体
type Student struct {
Name string
rollno int
course string
}
func main() {
// 创建结构体实例
a1 := Student{"Asha", 1, "CSE"}
a2 := Student{"Aishwarya", 1, "ECE"}
a3 := Student{"Priya", 2, "MECH"}
a4 := Student{"Ram", 3, "CSE"}
// 使用字面值映射声明和初始化
mp := map[Student]string{a1: "第一",
a2: "第二", a3: "第三", a4: "第四"}
value, check := mp[a4]
fmt.Println("键是否存在:", check)
fmt.Println("键的值:", value)
_, check2 := mp[a2]
fmt.Println("键是否存在:", check2)
}
输出:
键是否存在: true
键的值: 第四
键是否存在: true