
计算机科学中最有用的数据结构之一是哈希表。许多哈希表的实现具有不同的属性,但总的来说,它们提供了快速查找、添加和删除的功能。Go提供了一个内置的map类型来实现哈希表。
Go提供了另一种名为map的基本数据类型,它将唯一的键映射到值。 还有其他不同于地图的数据类型,例如Golang中的数组、结构体和片断。让我们开始我们的Golang地图教程。
Golang地图
Golang map是一种内置的数据类型,它的键在地图中是唯一的,而值可能是相同的,也可能不相同。一个键是一个对象,你用它来在以后检索值。给定一个键和一个值,你可以在Map对象中存储该值。在值被存储后,你可以通过使用它的键来检索它。
Golang中的地图数据结构用于快速查找、检索和删除基于键的数据;这就是为什么它是计算机科学中最常用的数据结构之一。 Golang地图是一个无序的键-值对集合。映射的键是值。
Go中地图的声明和初始化
一个Go地图类型看起来像下面这样。
map[KeyType]ValueType
其中KeyType可以是任何可比较的类型(后面会详细介绍),ValueType 可以是任何类型,包括另一个地图。
请看变量m是一个字符串键与int值的映射。
var m map[string]int
地图类型是引用类型,就像指针或片断一样,所以上面的m的值是nil。
一个nil地图没有键。一个nil地图在读取时表现得像一个空白地图。任何向nil 地图添加键的尝试都会导致运行时错误。
请看下面Go中nil变量的代码。
// hello.go
package main
import "fmt"
func main() {
var app map[string]int
fmt.Println(app)
if app == nil {
fmt.Println("app variable is nil")
}
}
请看下面的输出。
现在,让我们把项目添加到nil地图中,看看输出。
// hello.go
package main
import "fmt"
func main() {
var app map[string]int
app["dividend"] = 21
fmt.Println(app)
}
请看下面的输出。
这就是为什么在添加项目之前需要初始化一个地图。
在Golang中初始化一个地图
我们可以通过以下两种方式来初始化go地图。
- 使用内置的**make()**函数初始化地图。
- 使用map literal来初始化地图。
让我们逐一看看初始化地图的方法。
使用内置的make()函数初始化地图
你可以使用内置的**make()函数来初始化地图。你只需要把地图的类型传递给make()**函数。请看下面的语法。
var app = make(map[string]int)
现在,请看下面的代码示例。
// hello.go
package main
import "fmt"
func main() {
var app = make(map[string]int)
app["dividend"] = 21
fmt.Println(app)
}
请看下面的输出。
请看第二个例子。
// hello.go
package main
import "fmt"
func main() {
app := make(map[int]string)
app[21] = "facebook"
app[19] = "instagram"
app[46] = "whatapp"
fmt.Println(app)
}
现在,在你的控制台中运行,看看输出情况。在这个例子中,我们把键 改为整数 ,把值 改为字符串。
使用map literal初始化地图
map literal是一种非常方便的方法,可以用一些数据来初始化map。你只需要在大括号内传递由冒号分隔的键值对。请看下面的语法。
var app = map[string]int{
"k": 19,
"l": 21,
"a": 46,
}
现在,请看完整的示例代码。
// hello.go
package main
import "fmt"
func main() {
var app = map[string]int{
"k": 19,
"l": 21,
"a": 46,
}
fmt.Println(app)
}
请看输出。
向地图中添加项目(键值对
你可以使用下面的语法向初始化的地图添加新元素。
app[key] = value
我们在以前的例子中已经这样做了。我们可以添加尽可能多的键/值对。
请看下面的代码。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
fmt.Println(got)
}
首先,我们初始化了地图,然后将三个键/值对添加到地图中,并打印了该地图。
请看下面的输出。
如果你试图添加已经存在于map中的键,那么它将被新的值所覆盖。
请看下面的代码。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
fmt.Println("Before override the value")
fmt.Println(got)
fmt.Println("After override the value")
got[1] = "jon"
fmt.Println(got)
}
请看下面的输出。
在Go中从地图中删除一个键
delete()是一个内置的Golang函数,用于从地图中删除特定的条目。它需要地图和要删除的相应键。你可以使用地图的键来删除地图中的条目。请看下面的语法。
delete(map, key)
Go map的**delete()**函数并不返回任何值。而且,如果键在地图上不存在,它也不会做任何事情。请看下面的代码。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
fmt.Println(got)
fmt.Println("Let's delete the ned")
delete(got, 1)
fmt.Println(got)
}
在上面的代码中,我们有整数的键。如果我们想删除一个项目,那么在参数中我们需要两个东西。
- 地图
- 钥匙
我们使用了delete()函数并提供了map和key参数来删除ned值。
请看下面的输出。
如何在Golang Map中获取值
要获得Golang地图中分配给key的值,可以使用map[key] 这个语法。 如果地图中存在一个键,我们将得到分配的值。否则,我们将得到地图的值类型的0值。
请看下面的代码。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
dead := got[1]
fmt.Println(dead)
}
在上面的代码中,我们用它的键1从map得到的 值ned 检索了。我们将在输出中得到ned 。如果我们提供了一个在地图上不存在的键,那么它将返回空或nil。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
dead := got[19]
fmt.Println(dead)
}
这里,19键不存在于地图上。这就是为什么它将返回空或""。
检查键是否存在于地图中
要检查 键是否存在于Golang 地图中,使用语法map[key],它也会返回额外的布尔值,如果键存在于地图中则为真,如果不存在则为 假。
所以你可以通过使用下面的双值赋值语法来检查键在地图中是否存在。
value, exist := map[key]
如果键存在,布尔变量existence将为真,如果不存在,则为假。请看下面的代码。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
dead, exist := got[1]
fmt.Println(dead, exist)
}
请看下面的输出。
如果你试图检查一个不存在的键是否存在,那么你将得到false。
地图是引用类型
地图是引用类型,而不是值类型。当你把一个地图分配给新的变量时,它们都引用了同一个底层数据结构。 因此,对一个变量所做的改变将对另一个变量可见。
请看下面的代码例子。
// hello.go
package main
import "fmt"
func main() {
got := make(map[int]string)
got[1] = "ned"
got[2] = "arya"
got[3] = "jon"
gameofthrones := got
fmt.Println(got)
fmt.Println(gameofthrones)
fmt.Println("---Change the gameofthrones map---")
got[4] = "Daenerys"
fmt.Println(got)
fmt.Println(gameofthrones)
}
在上面的代码中,我们把gott地图 分配给gameofthrones地图 ,然后修改gameofthrones地图 ,看看gott 地图是否也有变化。请看输出。
这里,如果一个被修改了,两个都被修改了,这意味着go中的地图 是参考类型。
本教程就到此为止。
相关文章
The postGolang map:完整指南》首次出现在AppDividend上。








