开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

如何在Golang中使用地图

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

映射中有四个键/值对。

去地图循环

使用forrange关键字,我们可以遍历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教程。

未经允许不得转载:我爱分享网 » 如何在Golang中使用地图

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏