ホームページ >バックエンド開発 >Golang >## ネストされたスライスを含む Go データストアからエンティティを取得できないのはなぜですか?

## ネストされたスライスを含む Go データストアからエンティティを取得できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 10:06:30695ブラウズ

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

Go データストア エラー: ネストされた構造体スライスのスライス

Go を活用してパフォーマンスを向上させようとして、試行中にエラーが発生しました。 Python で定義された AppEngine データストアからエンティティを取得します。エラー メッセージ「データストア: ネストされた構造体を平坦化すると、スライスのスライスが発生します: フィールド "メッセージ"」は、Go プロジェクト モデルと Python プロジェクト モデル間の構造的不一致を示します。

Go モデル定義とデータストアの互換性

Go データストア パッケージには、データ モデルの構造に関して特定の制限があります。 ModelA 定義の「Messages」フィールドなど、スライス内のネストされたスライスはサポートされていません。つまり、ModelA に ModelB エンティティのスライスを含めることはできますが、ModelB 自体は独自のフィールド内にスライスを含めることはできません。

エラーを解決するための代替オプション

このエラーを解決するには、いくつかのオプションがあります:

  1. データストア インタラクションに Go を使用しない: データストア インタラクションに Go の使用を放棄し、Python を続行します。
  2. カスタム デシリアライザー: ネストされたスライスのスライスを処理できる独自のカスタム データストア デシリアライザーを開発します。ただし、このアプローチは複雑で、多大な労力が必要になる場合があります。
  3. データ構造の再定義: Go の制限に準拠するように Python データ構造を変更します。これには、ModelA または ModelB からネストされたスライスを削除し、それに応じてデータを再構築することが含まれます。

例: カスタム デシリアライゼーション用の PropertyLoaderSaver

カスタム デシリアライザーを選択した場合このアプローチでは、ModelA の PropertyLoaderSaver インターフェイス実装を定義して、「Messages」フィールドの逆シリアル化を処理できます。以下に例を示します:

<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>

以上が## ネストされたスライスを含む Go データストアからエンティティを取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。