代码如下,在不知道具体是哪个 struct 的时候,如下的代码要怎么玩?
```
package main
import (
"fmt"
"reflect"
"github.com/vmihailenco/msgpack"
)
type User struct {
Id int
Name string
}
func main() {
u := &User{1, "test"}
t := reflect.TypeOf(u).Elem()
n := reflect.New(t).Elem().Interface()
// 改成下面这样是正常的,但是在项目中并不知道是哪个结构体,也许是 Order, Pay...
// n := reflect.New(t).Elem().Interface().(User)
r, _ := msgpack.Marshal(u)
msgpack.Unmarshal(r, &n)
fmt.Println(n)
}
```
我遇到过这样的需求: 有很多个渠道,服务端需要根据客户端发来的支付请求向各个渠道服务器发起创建订单的请求,客户端发来的http请求里面只有一个渠道名称是唯一标识是哪个渠道的,其它字段是所有渠道共用的,我的服务端在收到客户端请求时会根据这个字符串用reflect动态创建一个类对象(每个渠道都会用一个单独的类来实现,但这些类都满足一个interface,这个interface里面定义了所有需要的接口,各个具体类只需要根据各自的情况实现这些接口),然后动态创建的这个对象只需要向上面那样转换成这个interface就可以使用了,不需要知道它的具体实现类: `reflect.New(t).Interface().(MyInterface)`
#3
更多评论