在本教程中,我们将了解 Go Map 数据类型,它属于复合类型的引用数据类型。您将学习 Map 在 Golang 中的含义,它如何定义、声明和初始化,还将讨论一些与 Map 一起使用的操作。
Map 是一种数据结构,包含一组键值对。在 Map 中,键值对是无序的数据集合或组合,需要像字典、哈希表或关联数组一样存储。

注意: Map 中的键是唯一的,值可以不同。
在 Golang 中,Map 是数据结构的关键字和名称。在 Golang 中定义 Map 的语法以 map 关键字开头,后跟方括号“[ ]”中键的数据类型和值的数据类型。键值对在花括号中初始化。
在 Golang 中声明 Map 的通用语法是
map [key_<datatype>] value_<datatype>{}
例如

var 关键字或速记符号,用于在 Go 编程语言中声明。var 关键字声明
Var a = make(map[string]int{
“first” : 1
“second”: 2
}
a := make(map[string]int){
“first” : 1
“second”: 2
}
var 关键字创建了一个 map 类型的变量。类似地,使用 := 声明了一个变量 a。map 数据结构,该结构是使用 make 函数创建的。
make( ) 概念与我们在 slice 教程中讨论的类似,这将在本教程的下一部分中详细讨论。在 Golang 中,Map 以以下方式创建和初始化
如果未提供带有特定键值对的花括号来初始化 Map,则 make( ) 会创建一个空 Map。让我们看看如何使用 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 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”。
使用字面量符号可以在 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 类型,并使用了速记符号。在花括号内部,我们通过使用“:” (冒号) 将它们赋值来指定与每个键关联的值。每个键值对用逗号分隔。
让我们通过一个示例来理解,该示例的输出如下所示
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() 的情况下没有这种概念。

长度函数用 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 元素使用 for 和 range 循环进行迭代。
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 操作包括插入、删除、更新和检索。让我们详细检查每个操作。

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]
在 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 中,检索操作允许从现有或已创建的 Map 中获取分配给特定键的值。该操作仅当存在此类键值对时才检索值,否则返回零值。
用于检索值的语法如下所示
map_Name[key]

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,如下面给出的程序所示
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.
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.