Golang | map的定义和使用
Map
map是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。
map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含有内建类型的结构体可以作为key。值可以是任意类型,没有限制。
初始化
var m1 map[string]string
m2 := make(map[string]string)
map作为参数传递给函数的代价非常的小,一般在32位位的机器上只需要4字段,64位的机器上需要8字节,并且无论是多少数据,在 map 中通过 key 查找对应的 value 非常的快的。
我们使用 map 的时候,如果事先知道元素所存数量的大小,我们我可能过 make 函数预先给一个合理的数,有助于提升性能,因为事先申请了一大块内存,可以避免后续操作时频繁扩张。
m := make(map[string]string,100)
简单使用
func main() {
m := map[string]string{
"a":"1",
"b":"2",
} // 初始化
if v, ok := m["a"]; ok { // 判断 a 是否存在,并获取 a 对应的值
fmt.Println(v)
}
fmt.Println(m["c"]) // 直接取不存在的值也不会报错,只会打印对应类型的初始值
m["a"] = "10" // 修改或添加map中的值
delete(m,"c") // 删除,如果 key 不存在也不会报错
fmt.Println(len(m)) // 打印对应键值对的数量
for k, v := range m { // 遍历 map,随机返回key
fmt.Println(k,v)
}
}
map中delete的使用
func main() {
m := make(map[int]struct{}) // 没有值的时候,可以使用 struct{} 初始化,节省空间
for i := 0; i < 10; i++ {
m[i] = struct{}{}
}
fmt.Println(m)
for k, _ := range m {
delete(m,k) // 可以在选代的时候安全的删除 map 中的值,但是添加就不可以了
}
fmt.Println(m)
}
map中添加或者修改时需注意
func main() {
// 因为map是无序的,每次扩张的时候,都会改变无素的位置
// 所以无法通过 key 直接修改value内部的值
m := map[string]user{
"a":{"张三"},
}
m["a"].name = "李四"
// 但是如果 value 是指针类型的,通过key 可以直接取到 value 的指针
// 就可以通过这种方法修改 value 内部的值
m2 := map[string]*user{
"a":&user{"张三"},
}
m2["a"].name = "李四"
}
Map 是无序的,但是有时候,我们想有序的取到 map 内部的值,所以我们只能通过对key进行排序,然后再通过key的值取对应value 的值。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!