- data.proto
message ColumnarValue { uint32 id= 1; int32 typ = 2; repeated bytes values = 3; }
data.go.proto
type ColumnarValue struct { Id uint32 `protobuf:"varint,1,opt,name=id,json=id,proto3" json:"id,omitempty"` Typ int32 `protobuf:"varint,2,opt,name=typ,json=typ,proto3" json:"typ,omitempty"` Values [][]byte `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` }
- 序列化
func (m *ColumnarValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalTo(b) if err != nil { return nil, err } return b[:n], nil }
func (m *ColumnarValue) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Id != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintData(dAtA, i, uint64(m.Id))
}
if m.Typ != 0 {
dAtA[i] = 0x10
i++
i = encodeVarintData(dAtA, i, uint64(m.Typ))
}
if len(m.Values) > 0 { // [][]byte序列化
for _, b := range m.Values {
dAtA[i] = 0x1a
i++
i = encodeVarintData(dAtA, i, uint64(len(b))) // 对byte Slice的长度(int值)编码
i += copy(dAtA[i:], b) // 直接复制b(bytes)切片
}
}
return i, nil
}
编码(slice长度)
func encodeVarintData(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return offset + 1
}
-
反序列化
func (m *VecValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) }
func (m *VecValue) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowData } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { return fmt.Errorf("proto: VecValue: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: VecValue: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowData } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ m.Id |= (uint32(b) & 0x7F) << shift if b < 0x80 { break } } case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Typ", wireType) } m.Typ = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowData } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ m.Typ |= (int32(b) & 0x7F) << shift if b < 0x80 { break } } case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowData } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ byteLen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } if byteLen < 0 { return ErrInvalidLengthData } postIndex := iNdEx + byteLen if postIndex > l { return io.ErrUnexpectedEOF } m.Values = append(m.Values, make([]byte, postIndex-iNdEx)) copy(m.Values[len(m.Values)-1], dAtA[iNdEx:postIndex]) // 直接复制dAtA切片中指定内容, go层内部 内存复制 iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipData(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthData } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } iNdEx += skippy } } if iNdEx > l { return io.ErrUnexpectedEOF } return nil }
来源:oschina
链接:https://my.oschina.net/u/4314362/blog/4872672