2016-04-10 9 views
2

私は現在golangを学んでおり、次のコードを持っています。 アイデアは、それにポインタの数を持つオブジェクトを持っている、私は変更し、ポインタのいずれかを使用してオブジェクトを削除したいと思います。 Go:ポインタでオブジェクトを削除する

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と思われます。

私には何が欠けていますか?

答えて

3

Goのすべての割り当ては、値によってコピーされます。

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

は割り当てであるため、fooの値はo1のコピーです。 あなたの目標を達成するために、あなたは間接値でコピーでUvelichitelのノート@説明する

o1 := &obj{1, "hello"} 
o2 := &obj{2, "world"} 

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

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

1

の1つの以上のレベルを、必要

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

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

o1 = nil 
m["foo"] // still is <0x10434120> 
関連する問題