Go – map的值不会更新

huangapple go评论78阅读模式
英文:

Go - map value doesn't update

问题

这里有一段示例代码(可在此处运行:http://play.golang.org/p/86_EBg5_95)

package main

import "fmt"

type X struct {
    Y int
}

func main() {
    m := make(map[int]X)
    var x *X
    if _, ok := m[0]; !ok {
        z := X{}
        m[0] = z
        x = &z
    }
    
    x.Y = 10
    fmt.Println(m[0].Y)
    fmt.Println(x.Y)
}

基本上,我在这里漏掉了什么?m[0].Y 不应该也是 10 吗?

英文:

I have some sample code here (runnable here: http://play.golang.org/p/86_EBg5_95)

package main

import "fmt"

type X struct {
	Y	int
}

func main() {
	m := make(map[int]X)
	var x *X
	if _, ok := m[0]; !ok {
		z := X{}
		m[0] = z
		x = &z
	}
	
	x.Y = 10
	fmt.Println(m[0].Y)
	fmt.Println(x.Y)
}

Basically: what am I missing here? Shouldn't m[0].Y be 10 as well?

答案1

得分: 3

x指向z,而m[0]z的一个副本(它是map[int]X而不是map[int]*X),所以更新x.Y不会更新m[0]

我不确定你想要做什么,但是这里的m是一个包含指针的映射:

func main() {
    m := make(map[int]*X)
    var x *X
    if _, ok := m[0]; !ok {
        z := X{}
        m[0] = &z
        x = &z
    }

    x.Y = 10
    fmt.Println(m[0].Y)
    fmt.Println(x.Y)
}

请注意,这是一个Go语言的代码示例。

英文:

x point to z while m[0] is a copy of z (it's a map[int]X and not a map[int]*X), so updating x.Y wont update m[0]

I'm not sure what you want to do, but here m is a map containing pointers:

func main() {
    m := make(map[int]*X)
    var x *X
    if _, ok := m[0]; !ok {
        z := X{}
        m[0] = &z
        x = &z
    }

    x.Y = 10
    fmt.Println(m[0].Y)
    fmt.Println(x.Y)
}

huangapple
  • 本文由 发表于 2014年11月21日 08:34:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/27052260.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定