类型比较时编译错误

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?

Error

impossible type switch case: err (type error) cannot have dynamic type "google.golang.org/appengine/datastore".ErrFieldMismatch (missing Error method)

my code

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
}

appengine code

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
}