datastore: invalid entity type
問題
cloud.google.com/go/datastore
datastore package - cloud.google.com/go/datastore - pkg.go.dev
を使ってDatastore | Google CloudにデータをPutしていて、掲題のエラーを得た。
ev := models.Event{/* なんらかの値 */}
if _, err := tx.Put(key, ev); err != nil {
return err
}
datastore: invalid entity type
調査
まずエラーメッセージが貧弱なので、定義を知りたい。
Search · datastore: invalid entity type · GitHub

あらためて、順当にPutを掘っていく。
Putでは、PutMultiを呼んでいるPutMultiでは、putMutationsを呼んでいるputMutationsでは、1つずつsaveEntityを呼んでいるsaveEntityでは、structに対しSaveStructを呼んでいるSaveStructでは、Saveの前にnewStructPLSを呼んでいる- PLSとは、PropertyLoadSaverのことで、Load/Saveの操作を担っている
newStructPLSでは、LoadないしSaveする値がポインタであるか見ており、ここでErrInvalidEntityTypeを返している

結論
Getのみならず、Put系であっても、Structの値はPointerである必要がある。
ev := models.Event{/* なんらかの値 */}
- if _, err := tx.Put(key, ev); err != nil {
+ if _, err := tx.Put(key, &ev); err != nil {
return err
}
雑感
- たしかにエラーメッセージとして十分だとは思うが、自作パッケージをつくるなら、もうちょっと丁寧に返したい
- 最近、WETもDRYもぜんぜん書いてなくてさみしい
DRYな備忘録として