Golang map 的值不可寻址,那如何修改值的属性?

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang map 的值不可寻址,那如何修改值的属性?相关的知识,希望对你有一定的参考价值。

阅读目录

map 的值不可寻址,那如何修改值的属性?

package main

type Person struct 
	Age int


func (p *Person) GrowUp() 
	p.Age++


func main() 
	m := map[string]Person
		"iswbm": PersonAge: 20,
	
	m["iswbm"].Age = 23
	m["iswbm"].GrowUp()

PS E:\\TEXT\\test_go\\test> go run .\\main.go
# command-line-arguments
.\\main.go:15:2: cannot assign to struct field m["iswbm"].Age in map
.\\main.go:16:13: cannot call pointer method GrowUp on Person       
PS E:\\TEXT\\test_go\\test> 

原因在于这两行:

m["iswbm"].Age = 23
m["iswbm"].GrowUp()

我们知道 map 的值是不可寻址的,当你使用 m["zhangsan"] 取得值时,其实返回的是其值的拷贝,虽然与原数据值相同,但是在内存中并不是同一个数据。

也正是这样,当 map 的值是一个普通对象(非指针),是无法直接对其修改的。

针对这种错误,解决方法有两种。

第一种:新建变量,修改后再覆盖

package main

import "fmt"

type Person struct 
	Age int


func (p *Person) GrowUp() 
	p.Age++


func main() 
	m := map[string]Person
		"iswbm": PersonAge: 20,
	
	
	p := m["iswbm"]
	p.Age = 23
	p.GrowUp()
	
	m["iswbm"] = p
	
	fmt.Println(m) // map[iswbm:24]

第二种:使用指针的方式

package main

import "fmt"

type Person struct 
	Age int


func (p *Person) GrowUp() 
	p.Age++


func main() 
	m := map[string]*Person
		"iswbm": &PersonAge: 20,
	
	m["iswbm"].Age = 23
	m["iswbm"].GrowUp()
	fmt.Printf("%v", m["iswbm"]) // &24

以上是关于Golang map 的值不可寻址,那如何修改值的属性?的主要内容,如果未能解决你的问题,请参考以下文章

Golang Map中value是不可寻址,可使用指针类型代替

go 指针

golang 中的指针

golang变量(二)——map和slice详解

Golang 中哪些值是不可以寻址的

golang 从 map 获取值时的值拷贝问题