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教程。