刚开始使用Go进行黑客攻击。

我正在尝试使用Stripe库。我尝试使用他们的自定义Charge调用来创建UnmarshalJSON类型,但我传递的任何参数似乎都无效。这里发生了什么?

var charge, err = sc.Charges.Get(id, nil)

if err != nil {
    log.Fatal(err)
}

thing := charge.UnmarshalJSON([]byte(charge))

这是函数:https://github.com/stripe/stripe-go/blob/master/charge.go#L162

我收到:./hello.go:48: cannot convert charge (type *stripe.Charge) to type []byte
尚未找到要满足此功能的传递参数。任何帮助表示感谢。

最佳答案

JSON转换为ChargeCharge.UnmarshalJSON()需要一个 byte slice ([]byte)。 Charge是一种结构类型,您不能将其值(也不能指向它的指针)转换为[]byte。这就是错误消息告诉您的内容。
UnmarshalJSON()方法期望的 byte slice 是描述Charge的JSON文本,或者研究UnmarshalJSON()的实现,它还接受单个JSON文本作为Charge ID。

所以这应该工作:

var charge, err = sc.Charges.Get(id, nil)

if err != nil {
    log.Fatal(err)
}

err := charge.UnmarshalJSON([]byte(`"123"`))

或以JSON表示的Charge结构(不完整):
var charge, err = sc.Charges.Get(id, nil)

if err != nil {
    log.Fatal(err)
}

s := `{"id":"123","amount":2000,"description":"testing"}`
err := charge.UnmarshalJSON([]byte(s))

fmt.Printf("%+v", thing)

输出应包含从JSON文本正确设置的以下字段,以及其他值为零的字段:
{Amount:2000 Desc:testing ID:123}
Charge转换为JSON

要打印格式正确的JSONt_code值的JSON表示形式,请使用 Charge :
out, err := json.Marshal(c)
if err != nil {
    panic(err) // handle error
}
fmt.Println(string(out))

或使用 json.Marshal() :
out, err := json.MarshalIndent(c, "", "  ")
if err != nil {
    panic(err) // handle error
}
fmt.Println(string(out))

示例输出(剥离):
{
  "amount": 2000,
  "description": "testing",
  "id": "123",
}

09-25 21:23