Go データストア エラー: ネストされた構造体スライスのスライス
Go を活用してパフォーマンスを向上させようとして、試行中にエラーが発生しました。 Python で定義された AppEngine データストアからエンティティを取得します。エラー メッセージ「データストア: ネストされた構造体を平坦化すると、スライスのスライスが発生します: フィールド "メッセージ"」は、Go プロジェクト モデルと Python プロジェクト モデル間の構造的不一致を示します。
Go モデル定義とデータストアの互換性
Go データストア パッケージには、データ モデルの構造に関して特定の制限があります。 ModelA 定義の「Messages」フィールドなど、スライス内のネストされたスライスはサポートされていません。つまり、ModelA に ModelB エンティティのスライスを含めることはできますが、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)), &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 サイトの他の関連記事を参照してください。