I get the compile error shown below saying that the ErrFieldMismatch type is missing an Error()
method, but as shown in the last code chunk, it is not.
Any idea to why I cannot perform the type comparison for this?
impossible type switch case: err (type error) cannot have dynamic type "google.golang.org/appengine/datastore".ErrFieldMismatch (missing Error method)
type Program struct {
aemodel.Base
Name string `json:"name" required:"true"`
Public bool `json:"isPublic"`
Description string `json:"description" required:"true"`
Default bool `json:"isDefault"`
Tags []string `json:"tags"`
// Level int
}
// Load - PropertyLoadSaver interface
func (p *Program) Load(ps []datastore.Property) error {
if err := datastore.LoadStruct(p, ps); err != nil {
switch err.(type) {
case datastore.ErrFieldMismatch: // <-- Failure point
return nil
default:
return err
}
}
return nil
}
type ErrFieldMismatch struct {
StructType reflect.Type
FieldName string
Reason string
}
func (e *ErrFieldMismatch) Error() string {
return fmt.Sprintf("datastore: cannot load field %q into a %q: %s",
e.FieldName, e.StructType, e.Reason)
}
Error
method is defined on the type that is a pointer to datastore.ErrFieldMismatch
, i.e., Error
is defined on *datastore.ErrFieldMismatch
, hence it's only *datastore.ErrFieldMismatch
that implements the Error
interface.
Try changing your case
expression:
func (p *Program) Load(ps []datastore.Property) error {
if err := datastore.LoadStruct(p, ps); err != nil {
switch err.(type) {
case *datastore.ErrFieldMismatch: // use pointer type here
return nil
default:
return err
}
}
return nil
}