Go地图教程展示了如何在Golang中使用地图。
映射是键/值对的无序集合,其中每个键都是唯一的。映射也称为字典、关联数组或哈希表。映射的大小(键值对的数量)由len函数确定。
地图是使用make函数或地图文字创建的。
要删除一对,我们可以使用内置的delete函数。映射的默认零值为nil。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
开始地图初始化
make函数创建一个空地图。
package main
import "fmt"
func main() {
var benelux map[string]string
benelux = make(map[string]string)
benelux["be"] = "Belgium"
benelux["nl"] = "Netherlands"
benelux["lu"] = "Luxembourgh"
fmt.Println(benelux)
fmt.Printf("%q\n", benelux)
}
我们有比荷卢联盟各州的地图。
var benelux map[string]string
声明了字符串键和字符串值的映射。
benelux = make(map[string]string)
使用make函数,我们创建了一个空地图。
benelux["be"] = "Belgium" benelux["nl"] = "Netherlands" benelux["lu"] = "Luxembourgh"
我们在地图上添加了三对。
$ go run init.go map[be:Belgium lu:Luxembourgh nl:Netherlands] map["be":"Belgium" "lu":"Luxembourgh" "nl":"Netherlands"]
package main
import "fmt"
func main() {
benelux := make(map[string]string)
benelux["be"] = "Belgium"
benelux["nl"] = "Netherlands"
benelux["lu"] = "Luxembourgh"
fmt.Println(benelux)
fmt.Printf("%q\n", benelux)
}
我们可以使用:=运算符来缩短语法。
去地图字面量
要使用文字符号创建和初始化映射,我们在花括号{}内指定键/值对。键和值用冒号字符分隔。每对用逗号分隔。
package main
import "fmt"
func main() {
m := map[string]float64{
"pi": 3.14159,
"e": 2.71828,
"ln2": 0.69314,
}
fmt.Println(m)
}
在代码示例中,我们使用映射文字语法创建常量映射。
去地图大小
地图的大小由len函数决定。它返回映射中的对数。
package main
import "fmt"
func main() {
countries := map[string]string{
"sk": "Slovakia",
"ru": "Russia",
"de": "Germany",
"no": "Norway",
}
fmt.Printf("There are %d pairs in the map\n", len(countries))
}
在代码示例中,我们创建了一个国家地图,其中国家代码是键,国家名称是值。我们在地图上打印国家的数量。
$ go run length.go There are 4 pairs in the map
映射中有四个键/值对。
去地图循环
使用for和range关键字,我们可以遍历mapelements。
package main
import "fmt"
func main() {
countries := map[string]string{
"sk": "Slovakia",
"ru": "Russia",
"de": "Germany",
"no": "Norway",
}
for country := range countries {
fmt.Println(country, "=>", countries[country])
}
for key, value := range countries {
fmt.Printf("countries[%s] = %s\n", key, value)
}
}
在代码示例中,我们以两种方式遍历国家地图。
for country := range countries {
fmt.Println(country, "=>", countries[country])
}
在第一种情况下,我们按对对象循环。
for key, value := range countries {
fmt.Printf("countries[%s] = %s\n", key, value)
}
在第二种情况下,我们通过键和值进行循环。
$ go run loop.go de => Germany no => Norway sk => Slovakia ru => Russia countries[ru] = Russia countries[de] = Germany countries[no] = Norway countries[sk] = Slovakia
去地图检查元素
我们通过引用其键来检查值是否存在。如果我们在左侧有一个变量,我们要么得到一个现有值,要么得到一个零值。如果左边有两个变量,我们得到值和一个布尔值,表示键在映射中的存在。
package main
import "fmt"
func main() {
grades := map[string]int{
"Lucia": 2,
"Paul": 1,
"Merry": 3,
"Jane": 1,
}
g := grades["Lucia"]
fmt.Println(g)
g = grades["Peter"]
fmt.Println(g)
g, found := grades["Lucia"]
fmt.Println(g, found)
g, found = grades["Peter"]
fmt.Println(g, found)
if g, found := grades["Jane"]; found {
fmt.Println(g)
}
}
在代码示例中,我们检查学生的成绩。
g := grades["Lucia"] fmt.Println(g)
这里我们打印Lucia的等级。
g = grades["Peter"] fmt.Println(g)
由于Peter不在地图中,我们得到一个零值(整数为0)。
g, found := grades["Lucia"] fmt.Println(g, found) g, found = grades["Peter"] fmt.Println(g, found)
在这里我们也得到了成绩和布尔值。
if g, found := grades["Jane"]; found {
fmt.Println(g)
}
这是获取布尔值并在if语句中检查它的简洁语法。
$ go run checking.go 2 0 2 true 0 false 1
去地图删除元素
使用delete函数从地图中删除一个元素。
package main
import "fmt"
func main() {
countries := map[string]string{
"sk": "Slovakia",
"ru": "Russia",
"de": "Germany",
"no": "Norway",
}
fmt.Println(countries)
delete(countries, "ru")
fmt.Println(countries)
}
在代码示例中,我们从国家地图中删除了一个国家。
$ go run removing.go map[de:Germany no:Norway ru:Russia sk:Slovakia] map[de:Germany no:Norway sk:Slovakia]
俄罗斯已成功移除。
Gomap是引用类型
Gomap是一种引用类型。这意味着当我们将引用分配给新变量或将映射传递给函数时,映射的引用将被复制。
package main
import "fmt"
func main() {
countries := map[string]string{
"sk": "Slovakia",
"ru": "Russia",
"de": "Germany",
"no": "Norway",
}
countries2 := countries
countries2["us"] = "USA"
fmt.Println(countries)
}
修改countries2地图,这是对countries的引用,原始地图也被修改。
Go结构映射
在下面的示例中,我们使用结构映射。结构是包含字段集合的用户定义类型。它用于将相关数据分组以形成一个单元。
package main
import "fmt"
type User struct {
name string
occupation string
}
func main() {
u1 := User{
name: "John Doe",
occupation: "gardener",
}
u2 := User{
name: "Richard Roe",
occupation: "driver",
}
u3 := User{
name: "Lucy Smith",
occupation: "teacher",
}
users := map[int]User{
1: u1,
2: u2,
3: u3,
}
fmt.Println(users)
}
在代码示例中,我们有一张用户地图。每个用户都由一个Go结构表示。
$ go run users.go
map[1:{John Doe gardener} 2:{Richard Roe driver} 3:{Lucy Smith teacher}]
在本教程中,我们使用了Golang中的地图。
列出所有Go教程。
