Heim >Backend-Entwicklung >Golang >## Warum kann ich mit verschachtelten Slices keine Entitäten aus Go Datastore abrufen?
Go-Datenspeicherfehler: Nested Structs Slices of Slices
Bei dem Versuch, Go für eine verbesserte Leistung zu nutzen, ist beim Versuch ein Fehler aufgetreten um Entitäten aus dem in Python definierten AppEngine-Datenspeicher abzurufen. Die Fehlermeldung „Datastore: Flattening Nested Structs Leads to a Slice of Slices: Field „Messages““ weist auf eine strukturelle Nichtübereinstimmung zwischen Ihren Go- und Python-Projektmodellen hin.
Go-Modelldefinitionen und Datenspeicherkompatibilität
Das Go-Datastore-Paket unterliegt bestimmten Einschränkungen hinsichtlich der Struktur Ihrer Datenmodelle. Verschachtelte Slices innerhalb von Slices, wie etwa das Feld „Nachrichten“ in Ihrer ModelA-Definition, werden nicht unterstützt. Dies bedeutet, dass Sie in ModelA zwar einen Slice von ModelB-Entitäten haben können, ModelB selbst jedoch keine Slices in seinen eigenen Feldern haben kann.
Alternative Optionen zur Behebung des Fehlers
Um diesen Fehler zu beheben, haben Sie mehrere Möglichkeiten:
Beispiel: PropertyLoaderSaver für benutzerdefinierte Deserialisierung
Wenn Sie den benutzerdefinierten Deserialisierer wählen Ansatz können Sie eine PropertyLoaderSaver-Schnittstellenimplementierung für ModelA definieren, um die Deserialisierung des Felds „Nachrichten“ zu handhaben. Hier ist ein Beispiel:
<code class="go">import ( "appengine_internal/datastore" "code.google.com/p/goprotobuf/proto" pb "appengine_internal/datastore" ) type ModelA struct { DateJoin time.Time `datastore:"date_join,"` Name string `datastore:"name,"` OwnerSalutation string `datastore:"owner_salutation,noindex"` OwnerEmailAddress string `datastore:"owner_email_address,"` LogoURL string `datastore:"logo_url,noindex"` Messages []ModelB `datastore:"-"` } // Load implements the PropertyLoaderSaver interface. func (seller *ModelA) Load(c <-chan datastore.Property) error { f := make(chan datastore.Property, 100) for p := range c { if p.Name == "bm" { var val pb.EntityProto err := proto.Unmarshal([]byte(p.Value.(string)), &val) if err != nil { return err } // TODO: Store the result as a new ModelB instance. } else { f <- p } } close(f) return datastore.LoadStruct(seller, f) }</code>
Das obige ist der detaillierte Inhalt von## Warum kann ich mit verschachtelten Slices keine Entitäten aus Go Datastore abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!