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

Go 不可能的类型切换情况:不能有动态类型,go,interface,switch-statement,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

具有以下结构:

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()))
                    }

                }
            }
        }
    }()
}

请您帮助我了解这里的错误是什么?

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

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

 case *dto.CapacityResponse:

出现此错误是因为
dto.CapacityResponse
类型与
*dto.CapacityResponse
类型不同。
因为您使用的是接口类型
dto的局部变量
r
。响应程序
case
语句中可以使用的唯一具体类型是实现此接口和
dto的类型。CapacityResponse
不是其中之一,因为它不是指针类型,并且您已将接收器声明为
dto.CapacityResponse
的指针。请看一看

 case *dto.CapacityResponse: