Go Maps


2022 年 1 月 8 日, Learn eTutorial
2206

在本教程中,我们将了解 Go Map 数据类型,它属于复合类型的引用数据类型。您将学习 Map 在 Golang 中的含义,它如何定义、声明和初始化,还将讨论一些与 Map 一起使用的操作。

Golang 中的 Map 是什么?

Map 是一种数据结构,包含一组键值对。在 Map 中,键值对是无序的数据集合或组合,需要像字典、哈希表或关联数组一样存储。

GO : Maps

注意: Map 中的键是唯一的,值可以不同。

如何在 Golang 中声明 Map?

在 Golang 中,Map 是数据结构的关键字和名称。在 Golang 中定义 Map 的语法以 map 关键字开头,后跟方括号“[ ]”中键的数据类型和值的数据类型。键值对在花括号中初始化。

在 Golang 中声明 Map 的通用语法是


map [key_<datatype>] value_<datatype>{}

例如

GO : Maps
  • 上述语法之后是 var 关键字或速记符号,用于在 Go 编程语言中声明。
    1. 使用 var 关键字声明
      
      Var a = make(map[string]int{
      “first” : 1
      “second”: 2
      }
      
      
    2. 速记符号
      
      a := make(map[string]int){ 
      “first” : 1
      “second”: 2
      }
      
      
  • 使用 var 关键字创建了一个 map 类型的变量。类似地,使用 := 声明了一个变量 a。
  • Map 通常用于将相关数据分组存储。在上面给出的代码中,变量“a”被赋值为 map 数据结构,该结构是使用 make 函数创建的。
  • 花括号 { } 包含键值对,键值对之间用分号“:”分隔,例如 key1: value1。键是字符串数据类型,值以数字格式(即整数类型 (int))存储。
    GO : Maps
  • 在上面给出的代码中,键是字符串“first”、“second”,值是整数 1、2。
  • 使用 make( ) 概念与我们在 slice 教程中讨论的类似,这将在本教程的下一部分中详细讨论。

如何在 Golang 中创建和初始化 Map?

在 Golang 中,Map 以以下方式创建和初始化

  1. 在 GoLang 中使用 make() 函数创建 Map

    如果未提供带有特定键值对的花括号来初始化 Map,则 make( ) 会创建一个空 Map。让我们看看如何使用 make( ) 创建一个空 Map。

    //创建空 Map 的程序

    
    package main
    import "fmt"
    
    func main() {
    // Declare a variable tutorial of type map
    
        var Tutorial map[string]string
    
    //initialize the key-value pairs  with nil values
    //creates an empty map
       Tutorial = make(map[string]string)   
       fmt.Println( Tutorial)
    }
    
    

    输出

    
    map[]
    

    在给定的示例中,变量 Tutorial 声明为 Map 类型。Map 类型指定了键和值均为字符串类型。

    
    var Tutorial map[string]string
    
    

    为了创建 Map,我们使用 make 函数,在此示例中,花括号内未指定任何键值,因此返回一个空 Map。

    
    //initialize the key-value pairs  with nil values
    //creates an empty map
       Tutorial = make(map[string]string)   
    
    

    现在我们将在上面解释的同一代码中检查如何在 make 函数创建 Map 后初始化值。让我们再次用相同的示例和一些更简单的代码来理解。

    
    package main
    import "fmt"
    
    func main() {
    // Declare a variable tutorial of type map
        var Tutorial map[string]string
    //initialize the key-value pairs 
       Tutorial = make(map[string]string)
     Tutorial["Go"] = "LANG"
        Tutorial[" Tutorial"] = "Learn eTutorials"
     
        fmt.Println( Tutorial)
        fmt.Printf("%q\n",  Tutorial)
    }
    
    

    输出

    
    map[ Tutorial:Learn eTutorials Go:LANG]
    map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
    

    使用 make 函数创建空 Map 的过程与上述代码相同。

    
    Tutorial = make (map[string]string)
    Tutorial["Go"] = "LANG"                     //line1
    Tutorial[" Tutorial"] = "Learn eTutorials" //line2
    
    

    键值在第 1 行和第 2 行初始化。使用方括号指定键的类型并后跟赋值运算符来为键赋值。
    在此示例中,第 1 行将字符串类型的键“Go”赋值为字符串类型的值“LANG”。

  2. 在 GoLang 中使用 Map 字面量创建 Map

    使用字面量符号可以在 Golang 中创建和初始化 Map。以下代码展示了如何表示字面量符号

    
    // creating a map of string & float32 type
        s := map[string]float32{ 
            "pi":  3.14159, /* initializing key-value pairs */
            "First":  1,
            "Second": 2,
        }
    
    

    在上面的代码中,s 被创建为 Map 类型,键值对被指定为字符串和 float32 类型,并使用了速记符号。在花括号内部,我们通过使用“:” (冒号) 将它们赋值来指定与每个键关联的值。每个键值对用逗号分隔。
    让我们通过一个示例来理解,该示例的输出如下所示

    //使用 Map 字面量的程序

    
    package main
    import "fmt"
    
    func main() {
       // creating a map of string & float32 type
        s := map[string]float32{
            "pi":  3.14159, /* initializing key-value pairs */
            "First":  1,
            "Second": 2,
        }
    
        fmt.Println(s) //dispalys output
    }
    
    

    输出

    
    map[First:1 Second:2 pi:3.14159]]
    

注意: 我们需要注意两种初始化类型之间的区别是,速记或字面量符号使用花括号 {} 来指定键值对,而 make() 的情况下没有这种概念。

GO : Maps

如何在 Golang 中查找 Map 的长度?

长度函数用 len( ) 表示,它表示在创建 Map 时在花括号内部初始化的键值对的数量。


package main
import "fmt"

func main() {
// Declare a variable tutorial of type map
    var Tutorial map[string]string
//initialize the key-value pairs 
   Tutorial = make(map[string]string)
 Tutorial["Go"] = "LANG"
    Tutorial[" Tutorial"] = "Learn eTutorials"
 
    
    fmt.Printf("%q\n",  Tutorial)
    //len() displays no of key-value pairs
    fmt.Printf("There are %d pairs in the map\n", len(Tutorial))
    
}

输出


map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
There are 2 pairs in the map

在上面的代码中,对的数量是 2,即
Tutorial”: “Learn eTutorials” (第一个键值对)
Go”: “LANG” (第二个键值对)

如何在 Golang 中使用循环遍历 Map?

在 Golang 中,Map 元素使用 for 和 range 循环进行迭代。

//使用 Map 循环的程序


func main() {
// Declare a variable tutorial of type map
    var Tutorial map[string]string
//initialize the key-value pairs 
   Tutorial = make(map[string]string)
 Tutorial["Go"] = "LANG"
    Tutorial[" Tutorial"] = "Learn eTutorials"
    
    fmt.Printf("%q\n",  Tutorial)
   
    fmt.Println(".................................")
    fmt.Println("Two Different representation using for & range")
    //for & range loop
    for key, value := range Tutorial {
    fmt.Printf("Tutorial[%s] = %s\n", key, value)
     }
 
  fmt.Println("")
 
  for LEARN := range Tutorial {
        fmt.Println(LEARN, "=>", Tutorial[LEARN])
    }
 
  fmt.Println("")  
}

输出


map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
.................................
Two Different representation using for & range
Tutorial[Go] = LANG
Tutorial[ Tutorial] = Learn eTutorials

Go => LANG
 Tutorial => Learn eTutorials

for key, value := range Tutorial {
    fmt.Printf("Tutorial[%s] = %s\n", key, value)
     }

使用 for 和 range 关键字的语法或代码以对对象的形式迭代以提供输出

Tutorial[Go] = LANG

Tutorial[ Tutorial] = Learn eTutorials


  for LEARN := range Tutorial {
        fmt.Println(LEARN, "=>", Tutorial[LEARN])
    }

使用 for 和 range 关键字的语法或代码以键值对的形式迭代以提供输出

Go => LANG

Tutorial => Learn eTutorials

Golang 中的 Map 操作有哪些?

Golang 中的 Map 操作包括插入删除更新检索。让我们详细检查每个操作。

GO : Map Operations

Map 中的删除操作

delete 关键字后跟 Map 的名称和要通过指定其键来消除的元素,执行 Map 中的删除操作。
示例
   delete(s,"pi")

此语法从创建的 Map s 中删除 pi。查看下面的程序和输出以更好地理解。


package main
import "fmt"

func main() {
   // creating a map of string & float32 type
    s := map[string]float32{
        "pi":  3.14159, /* initializing key-value pairs */
        "First":  1,
        "Second": 2,
    }

    fmt.Println(s) //dispalys output
    
    delete(s,"pi")
    fmt.Println(s)
}

输出


map[First:1 Second:2 pi:3.14159]
map[First:1 Second:2]

Map 中的插入和更新操作

在 Golang 中,可以随时插入新的键值对。同样,我们可以更新已经指定的值。例如,在下面创建的 tutorial map 程序中
其中包含输出所示的以下两个键值对。
“Tutorial”: “Learn eTutorials”
“Go”: “LANG”
稍后使用语法插入了一个新的键值对,现在长度将变为三
   Tutorial["Insert"] = "new string",输出为

“Tutorial”: “Learn eTutorials”
“Go”: “LANG”
“Insert”: “new string”

注意:更新操作几乎与插入相似,唯一的区别是我们为已定义的键类型指定一个新值,该值会替换旧值。


package main
import "fmt"

func main() {
// Declare a variable tutorial of type map
    var Tutorial map[string]string
//initialize the key-value pairs 
   Tutorial = make(map[string]string)
   fmt.Println( Tutorial)
    Tutorial["Go"] = "LANG"
    Tutorial[" Tutorial"] = "Learn eTutorials"
    fmt.Printf("%q\n",  Tutorial)
    //insert operation
    Tutorial["Insert"] = "new string"
    fmt.Printf("%q\n",  Tutorial)
    //update operation
     Tutorial["Tutorial"] = "Learn eTutorials users"
    fmt.Printf("Updated   %q\n",  Tutorial)
    
}

输出


map[]
map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
map[" Tutorial":"Learn eTutorials" "Go":"LANG" "Insert":"new string"]
Updated   map[" Tutorial":"Learn eTutorials" "Go":"LANG" "Insert":"new string" "Tutorial":"Learn eTutorials users"]

Golang 中的检索操作?

在 Golang 中,检索操作允许从现有或已创建的 Map 中获取分配给特定键的值。该操作仅当存在此类键值对时才检索值,否则返回零值。

用于检索值的语法如下所示


map_Name[key]
 
GO : Map Operations

Golang 中检索操作的程序


package main

import "fmt"

func main() {

 // Declare a variable tutorial of type map
 var Tutorial map[string]string

 //initialize the key-value pairs
 Tutorial = make(map[string]string)
 fmt.Println(Tutorial) // displays an empty map
 Tutorial["Go"] = "LANG"
 Tutorial[" Tutorial"] = "Learn eTutorials"
 fmt.Printf("%q\n", Tutorial) // displays non empy map

 //retrieve operation using var keyword
 var LangName = Tutorial["Go"]
 fmt.Println("Name of Language is %q  : ", LangName)

 //retrieve operation in single statement
 fmt.Println("SiteName is  %q :", Tutorial[" Tutorial"])

 //retrieve operation returns an empty string  " " if no key-pair exist
 fmt.Println("Retrieve operation returns an empty string   :", Tutorial[" year"])

}
 

输出


map[]
map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
Name of Language is %q  :  LANG
SiteName is  %q : Learn eTutorials
Retrieve operation returns an empty string   : 

Program exited.

注意:如果 Map 不存在,则根据 Map 的类型返回零值。

在上面的示例中,创建的 Map 是字符串类型,因此返回空格,这表示空字符串;如果是整数值,则返回 0,如下面给出的程序所示

Golang 中检索操作的程序


package main

import "fmt"

func main() {

 // Declare a variable tutorial of type map
 var Tutorial map[string]string

 //initialize the key-value pairs
 Tutorial = make(map[string]string)
 fmt.Println(Tutorial) // displays an empty map
 Tutorial["Go"] = "LANG"
 Tutorial[" Tutorial"] = "Learn eTutorials"
 fmt.Printf("%q\n", Tutorial) // displays non empy map

 //retrieve operation using var keyword
 var LangName = Tutorial["Go"]
 fmt.Println("Name of Language is %q  : ", LangName)

 //retrieve operation in single statement
 fmt.Println("SiteName is  %q :", Tutorial[" Tutorial"])

 //retrieve operation returns an empty string  " " if no key-pair exist
 fmt.Println("Retrieve operation returns an empty string   :", Tutorial[" year"])

}
 

输出


map[]
map[" Tutorial":"Learn eTutorials" "Go":"LANG"]
Name of Language is %q  :  LANG
SiteName is  %q : Learn eTutorials
Retrieve operation returns an empty string   : 

Program exited.

为整数类型 Map 的不存在的键值对检索 0 值的程序



package main

import "fmt"

func main() {
 var m = map[string]int{
  "one":   1,
  "two":   2,
  "three": 3,
  // Comma is necessary
 }

 fmt.Println(m)
 fmt.Println(m["six"]) //retrieve a 0 value for non existing key-value pair for map of int type
}
 

输出



map[one:1 three:3 two:2]
0

Program exited.