慕妹3146593
我能够使用低级protowire封装实现这一目标。下面是一个完整的示例,其中我提取了两个类型的字段(在原始架构中恰好分配了字段编号 4 和 5):uint64import "google.golang.org/protobuf/encoding/protowire"func getData(src []byte) (creationTime, expiryTime uint64, err error) { remaining := src for len(remaining) > 0 { fieldNum, wireType, n := protowire.ConsumeTag(remaining) if n < 0 { return 0, 0, fmt.Errorf("failed to consume tag: %w", protowire.ParseError(n)) } remaining = remaining[n:] switch fieldNum { case 4: // Expiry time if wireType != protowire.VarintType { return 0, 0, fmt.Errorf("unexpected type for expiry time field: %d", wireType) } expiryTime, n = protowire.ConsumeVarint(remaining) case 5: // Creation time if wireType != protowire.VarintType { return 0, 0, fmt.Errorf("unexpected type for creation time field: %d", wireType) } creationTime, n = protowire.ConsumeVarint(remaining) default: n = protowire.ConsumeFieldValue(fieldNum, wireType, remaining) } if n < 0 { return 0, 0, fmt.Errorf("failed to consume value for field %d: %w", fieldNum, protowire.ParseError(n)) } remaining = remaining[n:] } return}