将 int64 值设置为 *int64 指针 [duplicate]

Set int64 value to *int64 pointer [duplicate]

提问人:ZottoSL 提问时间:1/12/2023 更新时间:1/12/2023 访问量:215

问:

我需要映射结构来创建JSON结构。JSON 中的 collector_id 属性应该能够接受 null value 或 int value。 我有以下代码:

type purchaseInfo struct {
    CollectorID *int64 `json:"collector_id"`
}

func mapPurchaseInfo(collectorID int64) purchaseInfo {
    var collectorIDToSend *int64
    if collectorID < 0 {
        collectorIDToSend = nil
    } else {
        collectorIDToSend = collectorID
    }

    return purchaseInfo{
        CollectorID: collectorIDToSend,
    }
}

此代码无法编译,无法将 collectorID 分配给 collectorIDToSend。 有没有办法做到这一点?

谢谢!

json go 指针 null

评论

3赞 icza 1/12/2023
您可以取参数的地址:。以下是简化函数的方式: 在这里试试: go.dev/play/p/lRxqcarlfRecollectorIDcollectorIDToSend = &collectorIDfunc mapPurchaseInfo(collectorID int64) (r purchaseInfo) { if collectorID >= 0 { r.CollectorID = &collectorID }; return }
0赞 ZottoSL 1/12/2023
你好!如果我这样做,CollectorID 值不会采用地址而不是 int 值吗?
1赞 JimB 1/12/2023
@ZottoSL:这正是指针。指针也包含在 Go 之旅

答:

2赞 Lab210 1/12/2023 #1
  • 在 mapPurchaseInfo 函数的声明中,要正确地将参数中传递的值分配给 collectorIDToSend,必须使用 & 运算符来检索 collectorID 的内存地址。
  • 在构造 purchaseInfo 返回变量时,可以直接放置结构的字段,如示例所示。
type purchaseInfo struct {
        CollectorID *int64 `json:"collector_id"`
    }

    func mapPurchaseInfo(collectorID int64) purchaseInfo {
        var collectorIDToSend *int64
        if collectorID < 0 {
            collectorIDToSend = nil
        } else {
            collectorIDToSend = &collectorID
        }

        return purchaseInfo{
            CollectorID: collectorIDToSend,
        }
    }

评论

0赞 ZottoSL 1/12/2023
你好!如果我这样做,CollectorID 值不会采用地址而不是 int 值吗?
0赞 Lab210 1/12/2023
是的,没错!collectorIDToSend 是一个指针变量,它会指向 collectorID 变量所在的内存地址,存储在内存地址中的值将是 collectorID 的 int 值,而不是它自己的地址。当返回 purchaseInfo 结构时,struct 的 CollectorID 字段将被分配 collectorIDToSend 的值,因此 CollectorID 将取 collectorID 值存储的地址,而不是它自己的值。
0赞 Lab210 1/12/2023
可以使用 * 运算符获取存储在指针变量指向的内存地址处的值。因此,您可以使用 *collectorIDToSend 来获取 collectorID 的值。
-2赞 onepice 1/12/2023 #2

type purchaseInfo struct {
    CollectorID *int64 `json:"collector_id"`
}

func mapPurchaseInfo(collectorID *int64) purchaseInfo {
    if *collectorID < 0 {
        return purchaseInfo{CollectorID: nil}
    }
    return purchaseInfo{
        CollectorID: collectorID,
    }
}