Heim >Backend-Entwicklung >Golang >## Warum kann ich mit verschachtelten Slices keine Entitäten aus Go Datastore abrufen?

## Warum kann ich mit verschachtelten Slices keine Entitäten aus Go Datastore abrufen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-27 10:06:30690Durchsuche

## Why Can't I Retrieve Entities from Go Datastore with Nested Slices?

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:

  1. Go für Datenspeicher-Interaktion vermeiden: Verwenden Sie Go für Datenspeicher-Interaktion nicht mehr und fahren Sie mit Python fort.
  2. Benutzerdefinierter Deserialisierer: Entwickeln Sie Ihren eigenen benutzerdefinierten Datenspeicher-Deserialisierer, der verschachtelte Slices-Slices verarbeiten kann. Dieser Ansatz ist jedoch komplex und kann einen erheblichen Aufwand erfordern.
  3. Datenstrukturen neu definieren: Ändern Sie Ihre Python-Datenstrukturen, um den Einschränkungen von Go zu entsprechen. Dazu müssen die verschachtelten Slices entweder aus ModelA oder ModelB entfernt und Ihre Daten entsprechend umstrukturiert werden.

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)), &amp;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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn