2012-12-18 24 views
5

Napisałem simple program używając Go Playground na golang.org.Go: edytuj zamiast wartości mapy

Wyjście jest oczywiście:

second test 
first test 

Czy istnieje sposób, aby zmienić wartość mapy w miejscu? Wiem, że nie mogę wziąć andressa z a.Things[key]. Czy ustawienie to jest jedyną metodą, aby ustawić a.Things[key] = firstTest? Może z funkcją ChangeThing(key string, value string)?

Odpowiedz

6

Można to zrobić, przypisując wartości wskaźników do mapy do innej struktury.

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

package main 

import "fmt" 

type A struct { 
    Things map[string]*str 
} 

type str struct { 
    s string 
} 

func (a A) ThingWithKey(key string) *str { 
    return a.Things[key] 
} 

func main() { 
    variable := A{} 

    variable.Things = make(map[string]*str) 
    variable.Things["first"] = &str{s:"first test"} 

    firstTest := variable.ThingWithKey("first") 
    firstTest.s = "second test" 

    fmt.Println(firstTest.s) 
    fmt.Println(variable.ThingWithKey("first").s) 
} 
+0

dziękuję! Nie myślałem o tym. Twoja sugestia działa doskonale dla mnie. – Donovan

3

Można użyć wskaźnika jako wartość mapie http://play.golang.org/p/BCsmhevGMX

+0

Dziękuję, pomogło to. – Donovan

+0

Próbowałem to faktycznie, ale kompilator nie pozwolił mi wziąć adresu literału ciągu. Widzę, że udało ci się to osiągnąć, najpierw przypisując ciąg do zmiennej, a następnie biorąc adres zmiennej. Zastanawiam się, dlaczego jest to, że mogę wziąć adres inicjalizacji struct, ale nie inicjalizacji ciąg. – Daniel

Powiązane problemy