2016-04-10 21 views
2

Şu anda golang'i öğreniyorum ve şu kodlara sahibim. Fikir, kendisine bir dizi işaretçi içeren bir nesneye sahip olmaktır ve işaretçilerden birini kullanarak nesneyi değiştirmek ve silmek istiyorum. Git: bir nesneyi işaretçisiyle silin

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

Çıktı:

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> 

beklediğim olarak nesnenin iç görün değiştirme işleri (# 3). Ancak gerçek nesneyi (# 4) silmeyi denediğimde, gerçek nesneye dokunmadan işaretçinin kendisi sadece nil görünüyor.

Neyi eksik?

cevap

3

Git öğesindeki tüm ödevler, kopyaya göre değerlerdir.

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

bir atamadır, bu nedenle foo değeri o1'in bir kopyasıdır. senin amaca ulaşmak için size dolaylama değerine göre kopya üzerinde Uvelichitel notu @ açıklanması

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

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

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

1

bir düzey daha, ihtiyaç

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

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

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