为了账号安全,请及时绑定邮箱和手机立即绑定

如何区分整数空值和默认为零的整数与实际等于零的整数?

如何区分整数空值和默认为零的整数与实际等于零的整数?

Go
函数式编程 2022-09-19 21:14:12
我是一个长期迁移到Go的python用户,我仍然有一些问题需要重新获得管理类型和指针的基本技能。我有一个程序接收来自RabbyMq的事件(但是无论我们谈论什么运输,问题都是一样的)。其中一个偶数包含键入为 int 的可选字段 F1。我的理解是,如果事件中不存在该字段,则go将默认为0。但是0是该字段的有效值,我需要区分值为0的情况和未定义值的情况。我想让我的字段成为一个*int,实际上有“nil”作为值。但是,当收到事件时,F1是设置为实际的指向值,还是来自发送方的值地址?我还有其他选择吗?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

在大多数情况下,使用指向该值的指针是有意义的。例如

type RabbitMessage struct {
    F1 *int `json:"f1"`
    }

这将如何工作的确切细节取决于您在通过 RabbitMQ 发送数据之前如何序列化数据。如果您使用的是 JSON,那么这应该没有问题,因为空值和省略的值都将在 Go 中表示为 。提供该值后,它将设置为您期望的值(它不会使用发件人的地址)。nil


查看完整回答
反对 回复 2022-09-19
?
互换的青春

TA贡献1797条经验 获得超6个赞

“我还有其他选择吗?”-- 是的,您可以定义一个自定义类型,类似于 sql。空因特64。


type OptionalInt struct {

    Int     int

    IsValid bool

}


func NewOptionalInt(i int) OptionalInt {

    return OptionalInt{Int: i, IsValid: true}

}


func (o *OptionalInt) UnmarshalJSON(data []byte) error {

    if string(data) != "null" {

        if err := json.Unmarshal(data, &o.Int); err != nil {

            return err

        }

        o.IsValid = true

    }

    return nil

}


func (o OptionalInt) MarshalJSON() ([]byte, error) {

    if o.IsValid {

        return json.Marshal(o.Int)

    }

    return json.Marshal(nil)

}


查看完整回答
反对 回复 2022-09-19
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

如果您只控制接收方程序,则 AFAICT 您无法区分已自动初始化为 by 的 int 和已由发送方设置为的 int。00


但是,如果您可以修改发送程序,则另一种方法是在int一起添加布尔字段,以判断int是否已设置。然后在接收端,您可以检查布尔值是否为真。


您还可以发送指向 int 的指针:


type Message struct {

    Value *int `json:"value"`

}


message := Message{Value: 4}

但请注意,在取消编组时,您将获得一个int指针,您需要取消引用。


查看完整回答
反对 回复 2022-09-19
  • 3 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信