go语言能通过反射初始化一个非空的指针么??

soluty · · 725 次点击
贴一下代码中的一小段:其中的的gameProto.WineConfig为pb中定义的消息,这个代码能跑,但是替换成 v := reflect.ValueOf(cfg).Elem()就会报错 for i := _TITLE_LINE_NUM; i <= rowLast; i++ { cfg1 := &gameProto.WineConfig{} fmt.Println("1111", reflect.TypeOf(cfg1), cfg1) cfg := reflect.New(rtype).Elem().Interface() // 现在关键点在于reflect.New()不能真的创建出一个结构体指针,只能创建出一个nil值 //因为指针的零值就是nil,所以需要用到结构体的零值 reflect.Zero(v) 可以创建结构体的零值 v := reflect.ValueOf(cfg1).Elem() fmt.Println("v=", v, "cfg=", cfg, "rtype=", rtype) for j := 0; j <= colLast; j++ { rtype, needGen, name := getColumnType(xs.ReadStr(0, j, nil)) if !needGen { continue } val := xs.ReadStr(i, j, nil) switch rtype { case "ti": strings.Split(val, ";") case "ts": case "int32": iv, _ := strconv.Atoi(val) fieldV := v.FieldByName(name) fieldV.Set(reflect.ValueOf(proto.Int32(int32(iv)))) case "string": fieldV := v.FieldByName(name) fieldV.Set(reflect.ValueOf(proto.String(val))) } } sb.EncodeMessage(cfg.(proto.Message)) }
#1