Golang -- 字典

来源:互联网 发布:企业邮箱设置域名 编辑:程序博客网 时间:2024/06/05 19:36

字典

定义和初始化

作为无序键值对集合,字典要求key必须是支持相等运算符 ( == , != ) 的数据类型, 如 数字, 字符串, 指针, 数组, 结构体 以及对应的接口类型.
字典是引用类型, 使用make函数或初始化表达语句来创建.

package mainimport (    "fmt")func main() {    a := make(map[int]string)  // 字典 (make函数)    b := map[int]string{}  // 字典 (初始化语句)    c := map[int]struct{  // 匿名结构体作为值        name string        age int    }{        1: {"wss", 22},        2: {"fgs", 23},    }    a[1] = "a"    b[1] = "b"    fmt.Println(a)    fmt.Println(b)    fmt.Println(c)}

获取值

访问不存在的键值对, 默认返回零值,不会引发错误.
所以推荐使用ok-idiom模式.

package mainimport (    "fmt")func main() {    a := make(map[int]string)  // 字典 (make函数)    a[1] = "a"    a[2] = "b"    if v, ok := a[3]; ok {        fmt.Println(v)    }else {        fmt.Println("不存在的")    }}

修改value

因内存访问安全和hash算法等原因, 字典不能直接修改value成员.
正确的做法是返回整个value, 修改后再设置值. 或者value使用指针.

package mainimport (    "fmt")type user struct {    name string    age int}func main() {    m := map[int]user {        1: {"wss", 22},        2: {"fgs", 23},    }    // m[1].age ++  // 错误: cannot assign to struct field m[1].age in map    // 先获取value, 修改值后, 再设置key    u := m[1]    u.age ++    m[1] = u    fmt.Println(m)    // value使用指针    d := map[int]*user {        1: {"wss", 22},        2: {"fgs", 23},    }    d[1].age ++    fmt.Println(d)}