Golang 使用struct作为map键

Golang 使用struct作为map键

在Golang中, map 是一组无序的键值对集合。它被广泛使用,因为它提供了快速的查找和可以通过键检索,更新或删除的值。

语法:

map[Key_Type]Value_Type{}
Go

例如: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
}
Go

让我们看看如何在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)
} 
Go

输出:

True
map[{Pam Dehradun 2200}:1 {Ram Delhi 2400}:2 {Sam Lucknow 1070}:3]
Go

遍历一个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)
    }
} 
Go

输出:

{Ram Delhi 2400} 2
{Sam Lucknow 1070} 3
{Pam Mumbai 2200} 1
Pam
Ram
Sam
Go

在map中添加键值对: 在map中添加键值对使用以下语法:

map_name[struct_instance]=value 
Go

如果在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)
} 
Go

输出:

原始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)
Go

示例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)
    }
  
} 
Go

输出:

删除后剩余的map:
{Asha 1 CSE} = 1
{Aishwarya 1 ECE} = 2
{Priya 2 MECH} = 3
Go

检查键值对的存在性: 你可以检查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)
  
} 
Go

输出:

键是否存在: true
键的值: 第四
键是否存在: true
Go

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册