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

我是一个长期迁移到Go的python用户,我仍然有一些问题需要重新获得管理类型和指针的基本技能。

我有一个程序接收来自RabbyMq的事件(但是无论我们谈论什么运输,问题都是一样的)。其中一个偶数包含键入为 int 的可选字段 F1。

我的理解是,如果事件中不存在该字段,则go将默认为0。但是0是该字段的有效值,我需要区分值为0的情况和未定义值的情况。

我想让我的字段成为一个*int,实际上有“nil”作为值。但是,当收到事件时,F1是设置为实际的指向值,还是来自发送方的值地址?我还有其他选择吗?


函数式编程
浏览 90回答 3
3回答

喵喔喔

在大多数情况下,使用指向该值的指针是有意义的。例如type RabbitMessage struct {     F1 *int `json:"f1"`     }这将如何工作的确切细节取决于您在通过 RabbitMQ 发送数据之前如何序列化数据。如果您使用的是 JSON,那么这应该没有问题,因为空值和省略的值都将在 Go 中表示为 。提供该值后,它将设置为您期望的值(它不会使用发件人的地址)。nil

互换的青春

“我还有其他选择吗?”-- 是的,您可以定义一个自定义类型,类似于 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)}

拉莫斯之舞

如果您只控制接收方程序,则 AFAICT 您无法区分已自动初始化为 by 的 int 和已由发送方设置为的 int。00但是,如果您可以修改发送程序,则另一种方法是在int一起添加布尔字段,以判断int是否已设置。然后在接收端,您可以检查布尔值是否为真。您还可以发送指向 int 的指针:type Message struct {    Value *int `json:"value"`}message := Message{Value: 4}但请注意,在取消编组时,您将获得一个int指针,您需要取消引用。
打开App,查看更多内容
随时随地看视频慕课网APP