2013-08-16 105 views
9

đây là struct của tôi:Không thể đặt struct tôi để kho dữ liệu (golang)

type AreaPrerequisite struct { 
    SideQuestId int // 
    SideQuestProg int // progress 
} 

type AreaInfo struct { 
    Id    int    `datastore:""` 
    Name    string   `datastore:",noindex"` 
    ActionPoint  int    `datastore:",noindex"` 
    Prerequisite  AreaPrerequisite `datastore:",noindex"` 

    // ignored: 
    DsMonsters  []byte   `datastore:"-"` 
    DsStages   []byte   `datastore:"-"` 
    Monsters   AreaMonsters  `datastore:"-"` 
    Stages   []*StageEntry `datastore:"-"` 
} 

và đặt của tôi() gọi:

key := datastore.NewKey(c, "Area", "", int64(pArea.Id), nil) 
_, err := datastore.Put(c, key, *pArea) 
if err != nil { 
    return err 
} 

Nó mang lại cho tôi những lỗi sau khi cố gắng để đưa vào DS:

datastore: invalid entity type 

tôi đã kiểm tra doc: https://developers.google.com/appengine/docs/go/datastore/reference

kho dữ liệu: "-" phải đánh dấu một số trường không được hỗ trợ bị bỏ qua bởi kho dữ liệu. Không biết tại sao nó không thành công.

+0

Bạn đã đặt một số dữ liệu với cùng "Area" loại trước đây chưa? Nếu bạn đã cập nhật 'struct' của bạn sau khi đặt một số dữ liệu, hai biểu diễn có thể xung đột và tạo ra một lỗi. – val

Trả lời

15

Tôi thấy rằng tôi vô tình thêm * vào pArea như arg để put() để nó chuyển một giá trị thay vì con trỏ, gây ra lỗi loại thực thể không hợp lệ.

+0

Cảm ơn, điều này đã cứu tôi. – Jacob

+0

Thưa bạn, bạn cũng đã cứu tôi. – Ali

+0

Tôi gặp phải vấn đề tương tự, nhưng sử dụng PropertyList. Rõ ràng nếu bạn vượt qua trong một PropertyList nó cũng phải là một con trỏ không phải là một giá trị. http://stackoverflow.com/q/30792119/101923 –

4

Tôi cũng đã gặp phải vấn đề tương tự, trong trường hợp của tôi, tôi không đặt & trước khi thực thể được putted.

key := datastore.NewKey(c, "Area", "", int64(pArea.Id), nil) 
_, err := datastore.Put(c, key, &pArea) 
if err != nil { 
    return err 
} 

Thông báo các & trước &pArea

+1

Điều này khá hữu ích. Tôi thực sự thêm vào và tạo đối tượng, sau đó nó có thể được bỏ qua trong cuộc gọi đưa. VÍ DỤ. myObj: = & MyObj {} so với myObj: = MyObj {} –