Golang中无法捕获详细信息的解决方案

Golang中无法捕获详细信息的解决方案 我正在使用下面的 GitHub 仓库。

GitHub

tooolbox/cybersource-rest-client-go

Go 客户端库,用于 CyberSource REST API。通过创建 GitHub 账户为 tooolbox/cybersource-rest-client-go 的开发做出贡献。

我想将测试代码中返回的数据转换为单独的变量以便使用,但我无法获取到相应的值。

该测试在仓库的 main.go 文件中也可用。

created, err := c.Payments.CreatePayment(req)

log.Printf("\n\n")
log.Printf("Created: %v\n", created)
log.Printf("Err: %v\n", err)

我无法从存储在 created 中的返回值里解析数据。

任何帮助都将非常有用,因为我卡在这个问题上已经很久了。


更多关于Golang中无法捕获详细信息的解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢Sean,我成功访问到了数据。

更多关于Golang中无法捕获详细信息的解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我不太明白你这里的意思:

我无法从存储在 created 中的返回值中解组数据。

响应应该已经被解组到 *CreatePaymentCreated 中了。你能展示一下你用来访问数据的代码吗?

要解析CyberSource REST API客户端的返回值,你需要访问返回结构体的具体字段。根据该库的文档,CreatePayment方法返回的是*payments.PtsV2PaymentsPost201Response类型。

以下是正确解析返回数据的示例:

created, err := c.Payments.CreatePayment(req)
if err != nil {
    log.Fatalf("创建支付失败: %v", err)
}

// 访问返回结构体的字段
if created != nil {
    // 获取交易ID
    if created.Id != nil {
        transactionID := *created.Id
        log.Printf("交易ID: %s", transactionID)
    }
    
    // 获取订单信息
    if created.OrderInformation != nil {
        if created.OrderInformation.AmountDetails != nil && 
           created.OrderInformation.AmountDetails.TotalAmount != nil {
            amount := *created.OrderInformation.AmountDetails.TotalAmount
            log.Printf("订单金额: %s", amount)
        }
    }
    
    // 获取状态信息
    if created.Status != nil {
        status := *created.Status
        log.Printf("交易状态: %s", status)
    }
    
    // 获取提交时间
    if created.SubmitTimeUtc != nil {
        submitTime := *created.SubmitTimeUtc
        log.Printf("提交时间: %s", submitTime)
    }
}

如果你需要访问更多字段,可以检查结构体的定义。使用反射查看所有可用字段的示例:

func printStructFields(v interface{}) {
    val := reflect.ValueOf(v).Elem()
    typ := val.Type()
    
    for i := 0; i < val.NumField(); i++ {
        field := typ.Field(i)
        fieldValue := val.Field(i)
        
        if fieldValue.Kind() == reflect.Ptr && !fieldValue.IsNil() {
            derefValue := fieldValue.Elem()
            log.Printf("字段: %s, 类型: %s, 值: %v", 
                field.Name, 
                field.Type, 
                derefValue.Interface())
        }
    }
}

// 使用示例
printStructFields(created)

对于常见的支付信息提取,这里是一个更完整的示例:

type PaymentResult struct {
    TransactionID string
    Status        string
    Amount        string
    Currency      string
    SubmitTime    string
}

func extractPaymentInfo(created *payments.PtsV2PaymentsPost201Response) PaymentResult {
    result := PaymentResult{}
    
    if created == nil {
        return result
    }
    
    if created.Id != nil {
        result.TransactionID = *created.Id
    }
    
    if created.Status != nil {
        result.Status = *created.Status
    }
    
    if created.OrderInformation != nil && 
       created.OrderInformation.AmountDetails != nil {
        if created.OrderInformation.AmountDetails.TotalAmount != nil {
            result.Amount = *created.OrderInformation.AmountDetails.TotalAmount
        }
        if created.OrderInformation.AmountDetails.Currency != nil {
            result.Currency = *created.OrderInformation.AmountDetails.Currency
        }
    }
    
    if created.SubmitTimeUtc != nil {
        result.SubmitTime = *created.SubmitTimeUtc
    }
    
    return result
}

// 使用示例
paymentInfo := extractPaymentInfo(created)
log.Printf("支付结果: %+v", paymentInfo)

关键点:

  1. 所有字段都是指针类型,需要先检查是否为nil再解引用
  2. 使用*fieldName来获取指针指向的实际值
  3. 结构体嵌套较深,需要逐层检查nil值

检查库的源代码或文档以获取完整的字段定义,通常可以在payments包中找到PtsV2PaymentsPost201Response结构体的定义。

回到顶部