Rumah > pembangunan bahagian belakang > Golang > ## Mengapakah Saya Tidak Boleh Dapatkan Entiti daripada Go Datastore dengan Slices Bersarang?

## Mengapakah Saya Tidak Boleh Dapatkan Entiti daripada Go Datastore dengan Slices Bersarang?

Barbara Streisand
Lepaskan: 2024-10-27 10:06:30
asal
761 orang telah melayarinya

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

Go Datastore Error: Nested Structs Slices of Slices

Dalam usaha memanfaatkan Go untuk prestasi yang dipertingkatkan, anda telah menghadapi ralat semasa mencuba untuk mendapatkan semula entiti daripada stor data AppEngine yang ditakrifkan dalam Python. Mesej ralat "stor data: meratakan struktur bersarang membawa kepada sekeping kepingan: medan "Mesej"" menunjukkan ketidakpadanan struktur antara model projek Go dan Python anda.

Definisi Model Go dan Keserasian Datastore

Pakej stor data Go mempunyai had tertentu mengenai struktur model data anda. Ia tidak menyokong kepingan bersarang dalam kepingan, seperti medan "Mesej" dalam definisi ModelA anda. Ini bermakna walaupun anda boleh mempunyai sekeping entiti ModelB dalam ModelA, ModelB sendiri tidak boleh mempunyai sebarang kepingan dalam medannya sendiri.

Pilihan Alternatif untuk Menyelesaikan Ralat

Untuk menyelesaikan ralat ini, anda mempunyai beberapa pilihan:

  1. Elakkan Go for Datastore Interaction: Abaikan penggunaan Go for datastore interaksi dan teruskan dengan Python.
  2. Deserializer Tersuai: Bangunkan deserializer stor data tersuai anda sendiri yang boleh mengendalikan hirisan bersarang. Walau bagaimanapun, pendekatan ini adalah rumit dan mungkin memerlukan usaha yang ketara.
  3. Takrif Semula Struktur Data: Ubah suai struktur data Python anda untuk mematuhi had Go. Ini melibatkan mengalih keluar kepingan bersarang daripada ModelA atau ModelB dan menyusun semula data anda dengan sewajarnya.

Contoh: PropertyLoaderSaver untuk Penyahserikatan Tersuai

Jika anda memilih penyahserialisasi tersuai pendekatan, anda boleh menentukan pelaksanaan antara muka PropertyLoaderSaver untuk ModelA untuk mengendalikan penyahserialisasian medan "Mesej". Berikut ialah contoh:

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci ## Mengapakah Saya Tidak Boleh Dapatkan Entiti daripada Go Datastore dengan Slices Bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan