Golang Map中value是不可尋址,可以使用指針類型代替

Golang Map元素取址:golang

package main
import "fmt"
type UserInfo struct {
    Uid      string `json:"uid"`
    UserName string `json:"user_name"`
    Sex      int    `json:"sex"`
}

func main() {
    var user = make(map[string]UserInfo)
    uid := "0001"
    user[uid] = UserInfo{
        Uid:      uid,
        UserName: "jack",
        Sex:      1,
    }
    user[uid].UserName="polly"
    fmt.Println(user[uid])
}

以上代碼報錯:./map.go:19:20: cannot assign to struct field user[uid].UserName in map
緣由是 map 元素是沒法取址的,也就說能夠獲得 user[uid].UserName, 可是沒法對其進行修改。
解決辦法:使用指針的map
golang裏面的map,當經過key獲取到value時,這個value是不可尋址的,由於map 會進行動態擴容,當進行擴展後,map的value就會進行內存遷移,其地址發生變化,因此沒法對這個value進行尋址。也就是形成上述問題的緣由所在。map的擴容與slice不一樣,那麼map自己是引用類型,做爲形參或返回參數的時候,傳遞的是值的拷貝,而值是地址,擴容時也不會改變這個地址。而slice的擴容,會致使地址的變化。json

package main
import "fmt"
type UserInfo struct {
    Uid      string `json:"uid"`
    UserName string `json:"user_name"`
    Sex      int    `json:"sex"`
}
func main() {
    var user = make(map[string]*UserInfo)
    uid := "0001"
    user[uid] = &UserInfo{
        Uid:      uid,
        UserName: "jack",
        Sex:      1,
    }
    user[uid].UserName="polly"
    fmt.Println(user[uid])
}
相關文章
相關標籤/搜索