Golang中无法捕获详细信息的解决方案
Golang中无法捕获详细信息的解决方案 我正在使用下面的 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
我不太明白你这里的意思:
我无法从存储在
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)
关键点:
- 所有字段都是指针类型,需要先检查是否为nil再解引用
- 使用
*fieldName来获取指针指向的实际值 - 结构体嵌套较深,需要逐层检查nil值
检查库的源代码或文档以获取完整的字段定义,通常可以在payments包中找到PtsV2PaymentsPost201Response结构体的定义。

