我通过protobuf定义了n个message结构,并通过protoc编译生成了对应的struct。
所以在xxx.pb.go中有 typedef name1 struct{......}, typedef name2 struct {...}, ......typedef nameN struct{.....}
现在,我收到了这样一条信息,name, []byte,通过name我知道了对应结构体的名字,通过[]byte我知道了对应结构体序列化后的内容,现在我要生成相应的结构体。
我查了相关资料,步骤如下:
```
package main
import (
"fmt"
"reflect"
)
type Foo struct {
name string
}
type Bar struct {
age int
}
//用于保存实例化的结构体对象
var regStruct map[string]interface{}
func main() {
str := "Bar"
if regStruct[str] != nil {
t := reflect.ValueOf(regStruct[str]).Type()
v := reflect.New(t).Elem()
fmt.Println(v)
}
}
func init() {
regStruct = make(map[string]interface{})
regStruct["Foo"] = Foo{}
regStruct["Bar"] = Bar{}
```
这样确实能生成,fmt.Println(v)打印的信息是 {0},但是,根本不能改啊,v.name="ssddf",都报错,能不用说proto.unmarshal(byte, v)了
那么问题来了,我该怎么生成struct并反序列化?
首先导出age:
```go
type Bar struct {
Age int
}
```
然后:
```go
if regStruct[str] != nil {
t := reflect.ValueOf(regStruct[str]).Type()
v := reflect.New(t).Elem()
v.FieldByName("Age").SetInt(123)
fmt.Println(v)
}
```
#1
更多评论
楼主想要应该不是你这种写法,他想要的应该是一个可变的Type,然后用reflect或者new一个这个Type的对象,然后再用pb去unmarshal去得到这个一个真实的对象。
v.FieldByName 这个就定死了Type是不可变的了
#2
你这种要求有两种写法:
http://stackoverflow.com/questions/7850140/how-do-you-create-a-new-instance-of-a-struct-from-its-type-at-runtime-in-go
#3