我google到了以下这段代码
cols, _ := rows.Columns()
store := []map[string]interface{}{}
for rows.Next() {
columns := make([]interface{}, len(cols))
columnPointers := make([]interface{}, len(cols))
for i := range columns {
columnPointers[i] = &columns[i]
}
if err := rows.Scan(columnPointers...); err != nil {
return nil, err
}
m := make(map[string]interface{})
for i, colName := range cols {
val := columnPointers[i].(*interface{})
// fmt.Printf("the value to []byte is:%+v\n", string((*val).([]byte)))
m[colName] = *val
}
store = append(store, m)
}
把sql.RawBytes转成[]map[string]interface{}{}后,我想把里面的内容转为protobuf,所以,我先把m[colName] = *val
,改为m[colName] = (*val).([]byte)
,再使用proto.unmarshal,但是我的proto.Message有多个字段,其中还包括引用了其他字段,发现proto.unmarshal行不通。因为引用了其他字段,所以在存入mysql之前,我都全部proto.marshal:
pbdescription := &pb.Consignment{
Description: req.Description,
}
description, err := proto.Marshal(pbdescription)
if err != nil {
panic(err)
}
pbweight := &pb.Consignment{
Weight: req.Weight,
}
weight, err := proto.Marshal(pbweight)
if err != nil {
panic(err)
}
pbcontainers := &pb.Consignment{
Containers: req.Containers,
}
containers, err := proto.Marshal(pbcontainers)
if err != nil {
panic(err)
}
pbvesselid := &pb.Consignment{
VesselId: req.VesselId,
}
vesselid, err := proto.Marshal(pbvesselid)
if err != nil {
panic(err)
}
// insert Vessel entity data
rs, err := c.ExecContext(ctx, "INSERT INTO consignment (`description`, `weight`, `containers`, `vesselid`) VALUES(?, ?, ?, ?)",
description, weight, containers, vesselid)
if err != nil {
return nil, status.Error(codes.Unknown, "failed to insert into Consignment-> "+err.Error())
}