我是靠谱客的博主 热心早晨,最近开发中收集的这篇文章主要介绍Go struct 类型的 map 结构体成员不能修改的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

错误示例
  • 刚刚上手,我们都会习惯性的向下面这样赋值 ,示例如下
package main

import "fmt"

type person struct {
	name string
	age  int
	sex  string
}

func main() {

    //建立结构体map
	s := make(map[int]person)
	//给map赋值 
	s[1] = person{"tony", 20, "man"}
	fmt.Println(s[1])
	//修改map里结构体的成员属性的值
	s[1].name = "tom"
	fmt.Println(s[1].name)
}

  • 但是这样一些就会报 mainmain.go:17:12: cannot assign to struct field s[1].name in map 的错误

错误原因
  • x = y 这种赋值的方式,你必须知道 x的地址,然后才能把值 y 赋给 x
  • go 中的 mapvalue 本身是不可寻址的,因为 map 的扩容的时候,可能要做 key/val pair迁移
  • value 本身地址是会改变的
  • 不支持寻址的话又怎么能赋值呢

解决方法
package main

import "fmt"

type person struct {
	name string
	age  int
	sex  string
}

func main() {

	s := make(map[int]*person)

	s[1] = &person{"tony", 20, "man"}
	fmt.Println(s[1])
	s[1].name = "tom"
	fmt.Println(s[1].name)
}
  • 由刚刚得推断我们可以发现,只要知道了被修改值的地址,我们就可以修改它了
  • 所以我们使用指针和引用保证每次赋值都可以找到地址
  • 就可以实现 map 的结构体赋值了

最后

以上就是热心早晨为你收集整理的Go struct 类型的 map 结构体成员不能修改的问题的全部内容,希望文章能够帮你解决Go struct 类型的 map 结构体成员不能修改的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部