map与slice中结构体类型中成员变量的更新

寅恪光潜
领域专家: 人工智能技术领域
2022-11-17 18:04:08
package main

import "fmt"

type Person struct {
	Name  string
	Hobby string
}

func main() {
	/*
		m := make(map[string]Person)
		m["p"] = Person{"Tony", "Reading"}
	*/
	m := map[string]Person{
		"p": {"Tony", "Reading"},
	}
	m["p"].Name = "寅恪光潜"
	fmt.Println(m)
}

这个会报错,不能赋值给map里结构体类型中的成员变量:
 cannot assign to struct field m["p"].Name in map
我们修改成将这个map重新赋值给一个变量,来看下效果:

package main

import "fmt"

type Person struct {
	Name  string
	Hobby string
}

func main() {
	/*
		m := make(map[string]Person)
		m["p"] = Person{"Tony", "Reading"}
	*/
	m := map[string]Person{
		"p": {"Tony", "Reading"},
	}
	np := m["p"]
	np.Name = "寅恪光潜"
	np.Hobby = "Coding"
	m["p"] = np
	fmt.Println(m["p"])
}
//{寅恪光潜 Coding}

OK,这个就可以更新了,知道为什么吗?
还有另一种可以直接更改,那就是使用指针:

package main

import "fmt"

type Person struct {
	Name  string
	Hobby string
}

func main() {
	/*
		m := make(map[string]Person)
		m["p"] = Person{"Tony", "Reading"}
	*/
	m := map[string]*Person{
		"p": {"Tony", "Reading"},
	}
	m["p"].Name = "寅恪光潜"
	m["p"].Hobby = "Coding"
	fmt.Println(*m["p"])
}
//{寅恪光潜 Coding}

恩,没有问题,其实这些又回到了值类型和引用类型的区别
欢迎加入我们,一起学习go,一起进步成为技术达人!

...全文
35 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

198

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧