map基本使用及指针问题|Go主题月

简介: map基本使用及指针问题|Go主题月

map基本使用


初始化

// 使用make赋值
map1 = make(map[string]string)
// 字面量赋值
map2 := map[string]string{}

赋值

// make方式
map1 = make(map[string]string)
map1["go"] = "go语言"
// 字面量
map2 := map[string]string{
    "go" : "go语言",
}

访问

// 获取map1里key为`go`的值
value := map1["go"]

遍历

// 使用range关键字
for k,v:=range map1{
    fmt.Printf("key:%s  ==>  value:%s\n",k,v)
}

使用map存储指针会出现的问题

当map存在指针类型的值时,可能会出现如下情况

首先看看下面的代码输出情况:

package main
import (
  "fmt"
)
func main() {
  m2:=make(map[string]*Student)
  people := []Student{
    {Name: "Zhangsan", Age: 20},
    {Name: "Lilei", Age: 23},
    {Name: "Wangmeimei", Age: 22},
  }
  for _,v:=range people{
    m2[v.Name]=&v
  }
  for k,v:=range m2{
    fmt.Printf("key:%s  ==>  Name:%s\n",k,v.Name)
  }
}
type Student struct {
  Name string
  Age int
}

输出:

key:Zhangsan  ==>  Name:Wangmeimei
key:Lilei  ==>  Name:Wangmeimei
key:Wangmeimei  ==>  Name:Wangmeimei

是不是和期望的不一样,原先期望的是把切片里的*Student全部拷贝到m2集合里,可以现在复制的都是同一个。

图解

网络异常,图片无法展示
|

这是因为这个语句中vpeople的一个拷贝的值,他会随着遍历而不断变化。而m2里存的是v的在内存中的地址,所以在遍历完后,v地址上的值就是切片的最后一个值,所以我们m2集合里存的值就统一变成了切片最后的一个值了。

for _,v:=range people{
    m2[v.Name]=&v
}

改进

解决上面的方法也比较简单,就是改一下循环语句

- for _,v:=range people{
-    m2[v.Name]=&v
- }
+ for i,v:=range people{
+   m2[v.Name]=&people[i]
+ }

这样就是直接存储原切片的地址了。

目录
相关文章
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 Go
Go to Learn Go之指针
Go to Learn Go之指针
25 0
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 安全 Java
Go 指针
该文章深入探讨了Go语言中的指针概念,包括指针的获取、使用、限制以及如何安全地返回局部变量的地址,同时讨论了`unsafe.Pointer`在打破指针限制方面的作用。
15 3
|
3月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
3月前
|
存储 安全 NoSQL
Go map 读写性能优化 - 分片 map
Go map 读写性能优化 - 分片 map
43 1
|
3月前
|
存储 缓存 Go
如何检查 Go map 是否包含某个键?
【8月更文挑战第31天】
23 0
|
3月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
36 0
|
3月前
|
存储 Go 开发者
掌握Go语言中的指针
【8月更文挑战第31天】
15 0
|
3月前
|
Go 计算机视觉
Go从入门到放弃之指针
Go从入门到放弃之指针