我已经定义了一个像
// HistoryQueryResult structure used for returning result of history query
type BookingHistoryQueryResult struct {
CarRecord *Car `json:"record"`
BookingRecord *Booking `json:"record"`
TxId string `json:"txId"`
Timestamp time.Time `json:"timestamp"`
}
我正在尝试如下迭代
// QueryHistoryBooking returns all bookings found in world state
func (s *SmartContract) GetBookingHistory(ctx contractapi.TransactionContextInterface, carNumber string) ([]BookingHistoryQueryResult, error) {
var historyResults []BookingHistoryQueryResult
var carKey string
queryString := fmt.Sprintf("{\"selector\":{\"docType\":\"booking\",\"carNumber\":\"%s\"}}", carNumber)
queryBookingresultsIterator, err := ctx.GetStub().GetQueryResult(queryString)
if err != nil {
return nil, err
}
for queryBookingresultsIterator.HasNext() {
queryResponse, err := queryBookingresultsIterator.Next()
if err != nil {
return nil, err
}
bookingId := queryResponse.Key
resultsIterator, err := ctx.GetStub().GetHistoryForKey(bookingId)
for resultsIterator.HasNext() {
queryHistoryResponse, err := resultsIterator.Next()
if err != nil {
return nil, err
}
booking := new(Booking)
_ = json.Unmarshal(queryResponse.Value, booking)
timestamp, err := ptypes.Timestamp(queryHistoryResponse.Timestamp)
if err != nil {
return nil, err
}
// This is the portion that is causing the trouble
carKey = booking.CarNumber
car, err := s.QueryCar(ctx, carKey)
if err != nil {
return nil, err
}
historyResult := BookingHistoryQueryResult{
TxId: queryHistoryResponse.TxId,
Timestamp: timestamp,
BookingRecord: booking,
CarRecord: car,
}
historyResults = append(historyResults, historyResult)
}
}
return historyResults, nil
}