代码之家  ›  专栏  ›  技术社区  ›  RudziankoÅ­

不可能的类型切换情况:不能有动态类型

  •  5
  • RudziankoÅ­  · 技术社区  · 7 年前

    具有以下结构:

    package dto
    
    type CapacityResponse struct{
        Val int
        Err error
        TransactionID string
    }
    
    func (r *CapacityResponse) GetError() (error) {
        return r.Err
    }
    
    func (r *CapacityResponse) SetError(err error)  {
        r.Err = err
    }
    
    func (r *CapacityResponse) Read() interface{}  {
        return r.Val
    }
    
    func (r *CapacityResponse) GetTransactionId() string  {
        return r.TransactionID
    }
    

    其界面:

    package dto
    
    type Responder interface {
        Read() (interface{})
        GetError() (error)
        SetError(error)
        GetTransactionId() (string)
    }
    

    以及以下逻辑:

    func handler(w http.ResponseWriter, r *http.Request) {
        cr := request2CacheRequest(r)
        responseChan := make(chan dto.Responder)
    
        go func() {
            responder := processReq(cr)
            responseChan <- responder
        }()
    
        go func() {
            for r := range responseChan {
                if (r.GetTransactionId() == cr.TransactionID) {
                    switch r.(type) {
                    //case dto.KeysResponse:
                    //case dto.GetResponse:
                    //case dto.RemoveResponse:
                    //case dto.SetResponse:
                    case dto.CapacityResponse:
                        if i, ok := r.Read().(int); ok {
                            fmt.Fprintf(w, fmt.Sprintf("{'capasity': %d, 'err': %s}", i, r.GetError()))
                        }
    
                    }
                }
            }
        }()
    }
    

    我遇到异常:

    impossible type switch case: r (type dto.Responder) cannot have dynamic type dto.CapacityResponse (missing GetError method)
    

    你能帮我弄明白这里出了什么问题吗?

    2 回复  |  直到 7 年前
        1
  •  11
  •   Cerise Limón    7 年前

    错误消息表示dto。响应程序值不能包含dto。容量响应,因为dto。CapacityResponse缺少一个dto。响应程序方法(GetError)。

    指针类型实现接口。将案例更改为:

     case *dto.CapacityResponse:
    
        2
  •  3
  •   Pavlo Strokov    7 年前

    出现此错误是因为 dto.CapacityResponse 类型不同于 *dto.CapacityResponse 类型
    因为您使用的是局部变量 r 接口类型的 dto.Responder 您可以在中使用的唯一混凝土类型 case 语句是实现此接口和 dto。容量响应 不是其中之一,因为它不是指针类型,并且您已将接收器声明为 dto。容量响应 . 请看一下 playground example