2012-12-18 9 views
5

私はをgolang.orgのGo Playgroundを使って書きました。Go:地図の値の代わりに編集

出力は明らかである:

second test 
first test 

は、場所のマップの値を編集する方法はありますか?私はa.Things[key]の控訴を取ることができないことを知っています。だから、a.Things[key] = firstTestを設定する唯一の方法は?たぶん、関数ChangeThing(key string, value string)で?

答えて

6

マップの値を別の構造体に変換することで可能です。

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

ありがとうマップ値としてポインタを使用することができます!これについて考えなかった。あなたの提案は私にとって素晴らしい作品です。 – Donovan

3
+0

ありがとう、これが助けになりました。 – Donovan

+0

私はそれを実際に試みましたが、コンパイラは文字列リテラルのアドレスを取らせませんでした。文字列を最初に変数に代入してから、変数のアドレスを取得することで、この問題を回避できます。なぜ私は構造体の初期化のアドレスを取ることができるが、文字列の初期化のアドレスを取ることができないのだろうか。 – Daniel

関連する問題