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)
}

  • 但是這樣一些就會報 main\main.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 的結構體賦值了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章