一、基础初始化


    m := make(map[string]int)
    m["foo"] = 1
    m["bar"] = 2
    fmt.Println(m) // map[foo:1 bar:2]

基础的map初始化非常简单,通过make函数直接创建即可。然后使用m[key]=value的方式给map添加元素。这种方式是最常见的,也是最简单的方式。

但是需要注意的是,如果我们直接访问一个不存在的key,map会返回一个空值,而不是报错。因此在使用map时需要特别注意这一点。

二、初始化及默认值


    m := map[string]int{
        "foo": 1,
        "bar": 2,
    }
    fmt.Println(m) // map[foo:1 bar:2]

除了使用make函数初始化map外,还可以使用字面量方式初始化map。这种方式的语法比较简洁,直接在大括号内列出key-value对即可。

在使用该方式时,我们还可以指定map中元素的默认值。例如如下示例代码:

    m := map[string]int{
        "foo": 1,
    }
    fmt.Println(m["bar"]) // 0

在定义map时,我们可以指定value的类型(例如int、string等),但是并不能指定value的真实值。默认情况下,map中的所有value都是对应类型的零值。

三、元素删除


    m := map[string]int{
        "foo": 1,
        "bar": 2,
    }
    delete(m, "foo")
    fmt.Println(m) // map[bar:2]

如上代码所示,使用delete函数可以删除map中的元素。delete函数的第一个参数是需要删除元素的map,第二个参数是需要删除的元素的key。

需要注意的是,如果访问一个不存在的key,map会返回一个空值,但删除一个不存在的key不会有任何效果。

四、遍历map


    m := map[string]int{
        "foo": 1,
        "bar": 2,
    }
    for k, v := range m {
        fmt.Printf("key:%s,value:%d\n", k, v)
    }

在Golang中,遍历map使用for range语句。for range语句将map中的key-value对依次赋值给前两个变量(k和v)。可以使用这些变量在循环体内对map中的元素进行操作。

需要注意的是,map的遍历顺序是不确定的。如果需要特定顺序访问map中的元素,需要添加排序逻辑。

五、字符串作为key


    m := make(map[string]int)
    m["1"] = 1
    m[1] = 2
    fmt.Println(m["1"]) // 1
    fmt.Println(m[1])   // 2

Golang中的map可以使用多种不同类型作为key,包括字符串、数字、自定义类型等。

需要注意的是,如果我们同时使用字符串和数字作为key,则会发生类型转换。例如如上所示的示例代码中,"1"和1被视作两个不同的key。如果在map中同时使用了这两个key,会分别对应两个不同的value。

六、自定义类型作为key


    type Person struct {
        Name string
        Age  int
    }

    m := make(map[Person]int)
    p := Person{"张三", 18}

    m[p] = 1
    fmt.Println(m[p]) // 1

除了基本类型和字符串外,Golang中的map还可以使用自定义类型作为key。在这种情况下,需要确保自定义类型是可比较的。

可比较的类型包括:

  • 数值类型
  • 字符类型
  • 布尔类型
  • 指针类型
  • 数组类型,数组元素为可比较类型
  • 结构体类型,结构体中所有成员都是可比较类型

如果自定义类型不满足以上条件,需要实现自定义类型的比较方法。