2017-01-08 2 views
0

Es gibt zwei Strukturen A & B. B enthält A. Auch gibt es eine Funktion an A. Es gibt JSON des übergeordneten Objekts zurück. Ich erwarte, dass alle Objektfelder in json zu sehen, wenn ich die fonction auf Instanz von B nennen, aber ich bekomme nur Felder von A. Betrachten Sie bitte den Code:Vererbung & Json in Golang

type A struct { 
    Foo string 
} 

type B struct { 
    A 
    Bar string 
} 

func (object *A) toJson() []byte { 
    res, _ := json.Marshal(&object) 
    return res 
} 


func main() { 
    b := B{} 
    fmt.Println(string(b.toJson())) 
} 

I { „Foo“ erhalten erwarten: "", "Bar": ""} aber das Ergebnis ist {"Foo": ""}. Der erste Weg besteht darin, zwei getrennte Funktionen für beide Strukturen zu definieren. Aber gibt es die zweite Lösung mit einer Funktion? Vielen Dank im Voraus.

Antwort

1

Ihre Methode toJson() stammt von A struct. Ändern Sie es in Struktur B, dann erhalten Sie Ihr erwartetes Ergebnis.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type A struct { 
    Foo string `json:"foo"` 
} 

type B struct { 
    A 
    Bar string `json:"bar"` 
} 

func (object *B) toJson() []byte { 
    res, _ := json.Marshal(&object) 
    return res 
} 

func main() { 
    c := B{} 
    fmt.Println(string(c.toJson())) 
} 
+0

Dies ist der erste Weg, den ich in der Frage beschrieben habe. In diesem Fall muss ich zwei separate Funktionen definieren, die für A und B verwendet werden. Aber gibt es irgendeine Option in Go, um eine einzelne Funktion zu definieren, die für beide Strukturen funktioniert, wie die Methode in der klassischen OOP? –

+0

Ich glaube nicht, dass du das in Go machen könntest, denn hier hat Go keine Vererbung, sondern Einbettung. Sie können die Dokumente zum Einbetten hier https://golang.org/doc/effective_go.html#embedding sehen. genau wie Andy Antwort –

+0

https://www.youtube.com/watch?v=7YcLIbG1ekM&feature=youtu.be und dieses Video erklären alles über das Konzept, wie man Go schreibt. ich hoffe es hilft –