结构体指针作为map key 结构体值改变对map有影响吗

最近偶然用到了结构体指针作为map key 的场景。当时有点不太确定:go 语言使用map 时使用指针p作为key, 那修改指针p的值之后。这map 还包含p 吗?
接下来让我们一起看看:

当将指针作为 Map 的 Key 时,实际上是把指针的值作为键来进行插入和查找操作。因此,如果修改了该指针所指向的变量的值,那么并不会影响已经添加到 Map 中的键。因为这个指针仍然具有相同的值,所以它可以被用作一个标识符来检索和操作存储在Map中的数据

例如,以下代码定义了一个map[*int]string类型的映射,将指针p用作key来插入和索引数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
m := make(map[*int]string)

x := 1
p := &x

m[p] = "A" // 添加数据

fmt.Println(m) // map[0xc000016088:A]

*p = 2 // 修改变量x的值

fmt.Println(m) // map[0xc000016088:A]
}

在上面的示例中,我们首先创建了一个指针p,指向变量x的地址,并把p用作key将字符串”A”添加到了map中。

接下来,我们修改了变量x的值,将其从1修改为2。但是,当我们再次输出映射m时,发现其中的元素仍然是[p:”A”]。这是因为,在修改变量的值后,指针p的地址仍然相同,因此该指针作为键在Map中仍然有效。映射使用的是地址而不是变量的名称或值,因此不受值的更改的影响。

总之,在将指针用作Map键时,必须理解这种行为,并根据需要编写代码来处理和管理指针及其地址的值。


结构体指针作为map key 结构体值改变对map有影响吗
https://leiqi.top/2023-05-10-7dfabb45bbc2.html
作者
Lei Qi
发布于
2023年5月11日
许可协议