Golang访问公共结构的数据元素

Golang访问公共结构的数据元素,go,go-interface,Go,Go Interface,我将有一个应用程序,其中包含许多遵循Req/Rsp设计的消息。下面实现的是消息Foo的单个Req/Rsp。Req将遵循用于处理消息和返回响应的公共接口。所有Rsp消息都将嵌入MHRSP结构。我想在ProcessRequest方法之外设置响应状态。我遇到的问题是一个运行时故障,它是由下面标记为问题区域的代码块造成的 panic:interface conversion:interface{}是*main.FooRsp,而不是main.MHRSP 因为我会有很多消息,不仅仅是FooRsp,转换到Fo

我将有一个应用程序,其中包含许多遵循Req/Rsp设计的消息。下面实现的是消息Foo的单个Req/Rsp。Req将遵循用于处理消息和返回响应的公共接口。所有Rsp消息都将嵌入MHRSP结构。我想在ProcessRequest方法之外设置响应状态。我遇到的问题是一个运行时故障,它是由下面标记为
问题区域的代码块造成的

panic:interface conversion:interface{}是*main.FooRsp,而不是main.MHRSP

因为我会有很多消息,不仅仅是FooRsp,转换到FooRsp并不是解决方案,所以问题是,我如何以通用的方式处理这个问题(即,能够为任何Rsp设置成功和错误消息)

使用GDB Online编译的代码:

/******************************************************************************
欢迎来到GDB在线。
GDB联机是一个在线编译器和调试器工具,用于C、C++、Python、java、PHP、Ruby、Perl,
C#,VB,Swift,Pascal,Fortran,Haskell,Objective-C,汇编,HTML,CSS,JS,SQLite,Prolog。
从世界任何地方在线编码、编译、运行和调试。
*******************************************************************************/
包干管
进口(
“fmt”
“错误”
“编码/json”
)
类型MHREQIF接口{
ProcessRequest(eint)(接口{},错误)
}
类型MHRSP结构{
Success bool`json:“Success,empty”`
ErrorMessage字符串`json:“错误消息,省略为空”`
}
类型FooReq结构{
MHREQIF
名称字符串`json:“名称”`
}
类型FooRsp struct{
MHRSP
名称字符串`json:“名称”`
}
func(self*FooReq)ProcessRequest(eint)(接口{},错误){
rsp:=FooRsp{Name:self.Name}
如果0==e{
退货和rsp,无
}否则{
返回和rsp,错误。新建(“垃圾”)
}
}
func main(){
var msg_请求MHREQIF
msg_req=&FooReq{Name:“bob”}
rsp,err:=msg_请求处理请求(1)
如果错误!=零{
//------问题区域------------------
v:=rsp(MHRSP)
v、 成功=错误
v、 ErrorMessage=fmt.Sprintf(“%v”,err)
//------问题区域结束------------------
}
msg_字节,:=json.Marshal(rsp)
msg_字符串:=字符串(msg_字节)
fmt.Println(消息字符串)
}

感谢@mkopriva和@Adrian为我指明了正确的方向。有时从C++到OISS的转变是精神弯曲:P

以下是为任何在如何解决此类问题上有类似困难的人编写的工作代码

/******************************************************************************
欢迎来到GDB在线。
GDB联机是一个在线编译器和调试器工具,用于C、C++、Python、java、PHP、Ruby、Perl,
C#,VB,Swift,Pascal,Fortran,Haskell,Objective-C,汇编,HTML,CSS,JS,SQLite,Prolog。
从世界任何地方在线编码、编译、运行和调试。
https://www.onlinegdb.com/online_c++_编译程序
*******************************************************************************/
包干管
进口(
“fmt”
“错误”
“编码/json”
)
类型MHREQIF接口{
ProcessRequest(e int)(mRespif,错误)
}
MHRESPIF接口类型{
SetResponse(错误)
}
类型MHRSP结构{
MHRESPIF`json:“-”`
Success bool`json:“Success”`
ErrorMessage字符串`json:“错误消息,省略为空”`
}
类型FooReq结构{
MHREQIF
名称字符串`json:“名称”`
}
类型FooRsp struct{
MHRSP
名称字符串`json:“名称”`
}
func(自我*MHRSP)设置响应(错误){
如果错误!=零{
自我成功=错误
self.ErrorMessage=fmt.Sprintf(“%v”,err)
}否则{
自我成功=真实
}
}
func(self*FooReq)ProcessRequest(eint)(MHRESPIF,错误){
rsp:=FooRsp{Name:self.Name}
如果0==e{
退货和rsp,无
}否则{
返回和rsp,错误。新建(“垃圾”)
}
}
func main(){
var msg_请求MHREQIF
msg_req=&FooReq{Name:“bob”}
rsp,err:=msg_请求处理请求(1)
rsp.SetResponse(错误)
msg_字节,:=json.Marshal(rsp)
msg_字符串:=字符串(msg_字节)
fmt.Println(消息字符串)
}

声明一个接口,让MHRSP实现该接口,通过嵌入公共类型,所有“嵌入者”也将自动实现该接口,然后使用该接口设置字段。代替空接口
interface{}
have
ProcessRequest
返回一个接口,该接口具有可用于在公共类型上设置字段值的方法。是的,这里的问题是不正确使用空接口。函数返回
接口{}
,这几乎是不正确的;函数将
接口{}
作为参数有时是正确的。谢谢@mkopriva和Adrian