go - 不可能类型开关盒 : cannot have dynamic type

标签 go interface switch-statement

具有以下结构:

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)

你能帮我理解这里出了什么问题吗?

最佳答案

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

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

 case *dto.CapacityResponse:

关于go - 不可能类型开关盒 : cannot have dynamic type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967199/

相关文章:

go - 如何动态更改结构的json标签?

docker - 无法让 dep 和 dockerize 在 docker-compose 中一起工作(但它们是分开工作的)。为什么?

c# - C# 不支持多重继承,那么我怎样才能让它工作呢?

java - 如何将接口(interface)用作类?

c++ - 开关盒中的变量 : UB or compiler bug?

go - 如何在 golang 中记录 apache thrift 请求?

json - 如何从 MongoDB 获取数据并将其作为 Golang 中的 JSON 发送到 API

java - 为什么使用抽象类而不是接口(interface)?

c# - 接口(interface)或 switch 语句,找到正确的模式

java - 可以在 java 中使用 switch(java.lang.Object) 吗?