• 3.3 映射
    • 链接

    3.3 映射

    go语言中的映射在其他语言中叫字典或哈希表。正如你想象的:你可以定义一个键和值,然后可以从映射中获取、设置和删除这个值。

    和切片一样,映射也是可以通过make创建。让我们看看下面这个例子:

    1. func main() {
    2. lookup := make(map[string]int)
    3. lookup["goku"] = 9001
    4. power, exists := lookup["vegeta"]
    5. // 打印:0和false
    6. // 0代表一个整数型的默认值
    7. fmt.Println(power, exists)
    8. }

    使用len可以获得映射中键的个数。使用delete可以删除映射中的一个键值对。

    1. // 返回 1
    2. total := len(lookup)
    3. // 没有返回值, 可以调用一个不存在的键
    4. delete(lookup, "goku")

    映射是动态增长的。然后,我们也可以在使用make时传递第二个参数设置映射的初始大小:

    lookup := make(map[string]int, 100)

    如果你能知道你的映射有多少个键,定义时指定一个初始大小可以获得一定的性能提升。

    当你希望将一个映射作为一个结构体的字段时,你可以这样定义:

    1. type Saiyan struct {
    2. Name string
    3. Friends map[string]*Saiyan
    4. }

    初始化上面定义的结构体的一种方式:

    1. goku := &Saiyan{
    2. Name: "Goku",
    3. Friends: make(map[string]*Saiyan),
    4. }
    5. goku.Friends["krillin"] = ... //可以创建Krillin

    这里还有提供了另外一种方式去定义并初始化一个映射。类似make,这种方式是针对映射和数组。我们可以声明一个复合文字:

    1. lookup := map[string]int{
    2. "goku": 9001,
    3. "gohan": 2044,
    4. }

    for循环中,使用range关键字也可以遍历一个映射:

    1. for key, value := range lookup {
    2. ...
    3. }

    需要注意的是,编译映射并不是有序的。每次遍历映射时,返回的键值对都是随机的顺序。

    链接

    • 目录
    • 上一节:切片
    • 下一节:指针类型和值类型