2016-12-03 7 views
2

私はGoLangとインターフェイスと構造継承を試しています。SetAge()メソッドで年齢が正しく設定されないのはなぜですか?

私はその後、ちょうどこれを継承し、必要に応じて余分な値を追加するコア構造に共通のメソッドと値を保つことができるという考えを持つ構造のセットを作成しました:

あなたがすることもでき
type NamedThing interface { 
    GetName() string 
    GetAge() int 
    SetAge(age int) 
} 

type BaseThing struct { 
    name string 
    age int 
} 

func (t BaseThing) GetName() string { 
    return t.name 
} 

func (t BaseThing) GetAge() int { 
    return t.age 
} 

func (t BaseThing) SetAge(age int) { 
    t.age = age 
} 

type Person struct { 
    BaseThing 
} 

func main() { 
    p := Person{} 
    p.BaseThing.name = "fred" 
    p.BaseThing.age = 21 
    fmt.Println(p) 
    p.SetAge(35) 
    fmt.Println(p) 
} 

を外出先での遊び場にここで見つける:

https://play.golang.org/p/OxzuaQkafj

私はmainメソッドを実行したときしかし、年齢が「21」のままであるとSetAge()メソッドによって更新されていません。

私はSetAgeを正しく動作させるためにこれがなぜ必要なのかを理解しようとしています。

答えて

4

ファンクションレシーバーは値タイプなので、ファンクションスコープにコピーされます。関数の存続期間を過ぎて受け取った型に影響を与えるためには、あなたの型はあなたの型へのポインタでなければなりません。下記参照。

type NamedThing interface { 
    GetName() string 
    GetAge() int 
    SetAge(age int) 
} 

type BaseThing struct { 
    name string 
    age int 
} 

func (t *BaseThing) GetName() string { 
    return t.name 
} 

func (t *BaseThing) GetAge() int { 
    return t.age 
} 

func (t *BaseThing) SetAge(age int) { 
    t.age = age 
} 

type Person struct { 
    BaseThing 
} 

func main() { 
    p := Person{} 
    p.BaseThing.name = "fred" 
    p.BaseThing.age = 21 
    fmt.Println(p) 
    p.SetAge(35) 
    fmt.Println(p) 
} 
+0

私はそれを逃したと信じられない - ありがとう! 私は明確にコーディングを止めて眠らなければなりません。 – Stephen

関連する問題