1. 程式人生 > >golang中在遍歷陣列時,要修改陣列中變數無法修改成功的問題

golang中在遍歷陣列時,要修改陣列中變數無法修改成功的問題

記錄在寫go時遇到的一個小坑

例子:

package main

import (
	"fmt"
)

type UserInfo struct {
	Name 	string 		`json:"name"`
	UserId 	int 		`json:"user_id"`
}

type Message struct {
	Type string `json:"type"`
	Id	int `json:"id"`
	Permission	[]UserInfo	`json:"permission"`
}

func main(){
	Users := []UserInfo{
		UserInfo{Name:"b", UserId:2},
		UserInfo{Name:"c", UserId:3},
	}

	mdata := &Message{
		Type: "a",
		Id: 1,
		Permission: Users,
	}
	fmt.Println("初始mdata:", mdata)
	
	permissions := mdata.Permission
	for _, p := range permissions {
		p.UserId = 3
	}
	fmt.Println("第一次修改後mdata:", mdata)

	for index := range permissions {
		permissions[index].UserId = 3
	}
	fmt.Println("第二次修改後mdata:", mdata)

}

結果輸出:

初始mdata: &{a 1 [{b 2} {c 3}]}
第一次修改後mdata: &{a 1 [{b 2} {c 3}]}
第二次修改後mdata: &{a 1 [{b 3} {c 3}]}

為什麼第一次修改不成功呢?

我想大致原因是第一次修改中的p是另一個複製了permissions中變數的變數。然後第一次修改只是對p中值進行了修改,原始的permissions中的值還沒有修改。所以以後要修改需要用第二種方法,用index找到原始permission中對應的值進行修改。