3 回答
TA贡献1866条经验 获得超5个赞
让我们首先回顾一下幕后工作的代码,返回的是什么,然后我们一次一个地查看问题。
当我们用它调用sub.New()
方法params
时返回Subscription
类型
注意:我只会显示类型的有限定义,因为添加完整的结构会使答案变大,而不是特定于问题上下文
让我们看看Subscription
类型
type Subscription struct {
...
// Start of the current period that the subscription has been invoiced for.
CurrentPeriodStart int64 `json:"current_period_start"`
// ID of the customer who owns the subscription.
Customer *Customer `json:"customer"`
...
// List of subscription items, each with an attached price.
Items *SubscriptionItemList `json:"items"`
...
}
让我们看一下第一个错误
cannot use result.CurrentPeriodStart (type int64) as type time.Time in assignment
根据Subscription
我们可以看到CurrentPeriodStart
的类型是类型int64
,而你试图将它设置为类型的StartAt
字段,因为类型不同,一种类型不能分配给其他类型,为了解决这个问题,我们需要明确地将它转换为可以这样做:SubscriptionDetails
time.Time
time.Time
data.StartAt = time.Unix(result.CurrentPeriodStart, 0)
time.Unix
time.Time
方法从传递的值创建类型int64
并返回我们可以分配给StartAt
字段的类型
现在让我们继续第二个错误
cannot use result.Customer (type *stripe.Customer) as type string in assignment
正如我们从Subscription
定义Customer
字段中看到的那样,*Customer
它不是字符串类型,因为您试图将类型分配给*Customer
字符串CustomerId
类型的字段,这不可能导致上述错误,引用的数据不正确那么正确的数据在哪里正确的数据在带有字段的*Customer
类型中可用ID
,可以按如下方式检索
data.CustomerId = result.Customer.ID
让我们回顾一下最后一个错误
result.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)
同样,如果我们查看Subscription
定义,我们可以看到Items
字段是类型*SubscriptionItemList
类型,如果我们查看*SubscriptionItemList
定义
type SubscriptionItemList struct { APIResource ListMeta Data []*SubscriptionItem `json:"data"`}
它包含一个字段名称Data
,Data
类型[]*SubscriptionItem
注意它是 slice []
of *SubscriptionItem
,这是错误的原因,因为Data
字段是 slice of*SubscriptionItem
我们可以解决问题如下:
data.PricePerSeat = result.Items.Data[0].price.UnitAmount
我想指出的可能发生的错误很少,请继续阅读下面的内容以解决这些问题
现在让我们看看*SubscriptionItem
定义
type SubscriptionItem struct { ... Price *Price `json:"price"` ... }
它包含Price
名称以大写字母开头的字段通知,在共享代码中它以小写字母引用,这可能会导致另一个问题,最后如果我们查看Price
定义
type Price struct { ... // The unit amount in %s to be charged, represented as a whole integer if possible. Only set if `billing_scheme=per_unit`. UnitAmount int64 `json:"unit_amount"` // The unit amount in %s to be charged, represented as a decimal string with at most 12 decimal places. Only set if `billing_scheme=per_unit`. UnitAmountDecimal float64 `json:"unit_amount_decimal,string"` ... }
它包含UnitAmount
我们正在使用的字段,但这里有一个问题UnitAmount
是类型,int64
但类型PricePerSeat
是类型,float64
将不同的类型分配给彼此会再次导致错误,因此您可以转换int64
为float64
或者更好的是您可以使用包含的类型中UnitAmountDecimal
可用的字段格式Price
相同的数据float64
将减少我们在使用UnitAmount
字段时必须进行的显式转换,因此根据我们得到以下解决方案的解释
data.PricePerSeat = result.Items.Data[0].Price.UnitAmountDecimal
TA贡献1829条经验 获得超7个赞
查看您提到的3个错误
cannot use result.CurrentPeriodStart (type int64) as type time.Time in assignment
的类型result.CurrentPeriodStart
是 int64 并且您试图将其设置为类型的字段time.Time
,这显然会失败。 API 以 unix 格式发送时间,您需要对其进行解析以将其转换为 time.Time。对其他时间字段也执行此操作
data.StartAt = time.Unix(result.CurrentPeriodStart, 0)
cannot use result.Customer (type *stripe.Customer) as type string in assignment
与上述类似的问题,当您尝试将其设置为 type 的字段时,该字段是 typeresult.Customer
的。客户 ID 是结构中的一个字段*stripe.Customer
string
Customer
data.CustomerId = result.Customer.ID
result.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)
stripe.SubscriptionItem
结构没有字段price
。我不确定你在这里想要什么。我建议阅读订阅对象文档。
TA贡献1735条经验 获得超5个赞
访问价格result.Items.Data[0].Price.UnitAmount
如果您使用调试器,只需sub.New
在行后放置一个断点并探索结果变量的内容
- 3 回答
- 0 关注
- 130 浏览
添加回答
举报