【问题标题】:impossible type switch case: cannot have dynamic type不可能的类型开关盒:不能有动态类型
【发布时间】:2018-08-04 15:38:43
【问题描述】:

有以下结构:

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)

请您帮我理解这里出了什么问题?

【问题讨论】:

    标签: go interface switch-statement


    【解决方案1】:

    错误消息是说 dto.Responder 值不能包含 dto.CapacityResponse,因为 dto.CapacityResponse 缺少 dto.Responder 方法之一 (GetError)。

    指针类型实现接口。将大小写更改为:

     case *dto.CapacityResponse:
    

    【讨论】:

      【解决方案2】:

      您遇到此错误是因为 dto.CapacityResponse 类型与 *dto.CapacityResponse 类型不同。
      因为您使用的是接口类型dto.Responder 的局部变量r,所以您可以在case 语句中使用的唯一具体类型是那些实现此接口的类型,而dto.CapacityResponse 不是其中之一,因为它不是指针类型并且您已将接收者声明为dto.CapacityResponse 的指针。请关注playground example

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多