doumen5087 2016-08-17 18:47
浏览 48
已采纳

类型比较时编译错误

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)
}
  • 写回答

1条回答 默认 最新

  • dtf54486 2016-08-17 18:52
    关注

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?