Go:通过指针删除对象

时间:2016-04-10 15:52:31

标签: pointers go

我目前正在学习golang,并且有以下代码。 我的想法是让一个对象有很多指针,我想用其中一个指针修改和删除对象。

package main

import "fmt"

type obj struct {
    a int
    b string
}

func main() {
    o1 := &obj{1, "hello"}
    o2 := &obj{2, "world"}

    m := map[string]*obj{
        "foo": o1,
        "bar": o2,
    }

    fmt.Printf("1: %t %v\n", o1, o1)
    fmt.Println("2:", m, m["foo"], o1)

    o1.b = "WWWW"
    fmt.Println("3:", m, m["foo"], o1)

    o1 = nil
    fmt.Println("4:", m, m["foo"], o1)
}

http://play.golang.org/p/lqQviVuTQN

输出:

1: &{%!t(int=1) %!t(string=hello)} &{1 hello}
2: map[foo:0x10434120 bar:0x10434130] &{1 hello} &{1 hello}
3: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} &{1 WWWW}
4: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} <nil>

改变对象的内部结构正如我所料(#3)。 但是,当我尝试删除实际对象(#4)时,它似乎只是nil指针本身而没有触及实际对象。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

解释@ Uvelichitel关于按值复制的说明,

o1 := <0x10434120>
m := map[string]*obj{
    "foo": <0x10434120>,
}

o1.a = "WWW" // <0x10434120>.a = "WWW" changing both places

o1 = nil
m["foo"] // still is <0x10434120>