2

私は Go が初めてで、この問題にどのようにアプローチすればよいかわかりません。OOP 用語では、Animal の基本クラスと、Cat と Dog の 2 つのサブクラスがあります。すべての動物で機能する Animal の ToJson メソッドを指定したいと考えています。

私の問題は、dog.ToJson() を呼び出すと、dog の Dog プロパティのみが取得され、Animal プロパティは取得されないことです。

ToJson を期待どおりに動作させるにはどうすればよいですか (つまり、再帰を使用)?

編集:lbonnによる回答の提案を反映するようにコードを変更しましたが、希望どおりに動作させることができませんでした。edit2:コード変更後の問題の一貫性

package main

import (
    "encoding/json"
    "fmt"
)

type Animal struct {
    Name string
}

type Cat struct {
    CatProperty int64
    Animal
}

type Dog struct {
    DogProperty int64
    Animal
}

func ToJson(i interface{}) []byte {
        data,err := json.Marshal(i)
    if err != nil {
        panic("???")
    }
    return data
}

func main() {
    dog := Dog{}
    dog.Name = "rex"
    dog.DogProperty = 2
    fmt.Println(string(ToJson(dog)))
    // Prints {"DogProperty":2}
    // I want it to print {"Name":"rex","DogProperty":2}
}
4

2 に答える 2

4

匿名フィールドの Json エンコーディングは go 1 から削除されました。うまくいけば、go 1.1 で復活するでしょう。詳細については 、 https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/jYMHbEv44r4を参照してください。

したがって、標準ライブラリで現在 (go 1 で) 得られる最高のものはhttp://play.golang.org/p/LncNFeN8ysです

go 1.1 がリリースされるまで、 skelterjohn のパッチhttps://github.com/skelterjohn/json/をいつでも使用して、匿名フィールドをサポートできます。

または、ヒントを使用して、この問題が修正されたソースからインストールします。https://codereview.appspot.com/6460044を参照してください

于 2012-12-29T05:45:59.403 に答える
2

ここで、ToJsonメソッドは の無名フィールドAnimalに適用されDogます。この呼び出しd.ToJsonは、 への可視性のショートカットにすぎませんd.Animal.ToJsonGoLang チュートリアル: 構造体の匿名フィールド

ここでは、メソッドの代わりに関数を記述します ( の単純なラッパーMarshal)。

func ToJson(i interface{}) []byte {
    data,err := json.Marshal(i)
    if err != nil {
        panic("???")
    }
    return data
}

これは動物や犬に固有のものではありませんが、実際にそうする必要はありません。

より一般的に言えば、go には継承の実際の概念はありません。この言語で使用されるオブジェクト パラダイムは、Java や C++ などの主流の OOP とはまったく異なります。Go FAQは、それについていくつかの明確な説明を提供します。

于 2012-12-29T04:10:18.387 に答える