在接收方法中分配给nil指针

时间:2017-03-09 09:28:58

标签: pointers go null

我正在尝试在将使用JSON编码/解码的结构中使用time.Time结构。如果未设置time.Time标记,则不应包含time.Time属性,因此为了能够这样做,我将不得不使用指向time.Time对象的指针。

我已经为type EncodeThis struct { Str string `json:"str,omitempty"` Date *jWDate `json:"date,omitempty"` } 结构定义了一个类型,因此我很容易创建接收函数格式化JSON编码和解码等的时间。

请参阅此处的代码:omitempty

所以在我的主结构(实际将被编码的结构)中,我会做这样的事情:

RecyclerView

问题是指针在尝试解码值时可能是nil,所以如果你在Go操场上查看我的代码,你可以看到我正在尝试(使用双指针)来设置地址接收器如果没有。请参见方法“设置”和“交换”。

但是,这似乎不起作用。程序没有失败或任何东西,但“EncodeThis”结构将不包含对这个新地址的引用。有什么想法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

使用包含指向time.Time对象的指针的结构包装日期对象。

// JWDate: Numeric date value
type jWDate struct {
    date *time.Time
}

func (jwd *jWDate) Set(t *time.Time) {
    if jwd.date == nil {
        jwd.date = t
    }
}

如果您需要访问time.Time结构中的jWDate方法,则可以嵌入它。使用嵌入式类型,您仍然可以轻松访问对象的指针:

// JWDate: Numeric date value
type jWDate struct {
    *time.Time // Embedded `time.Time` type pointer, not just an attribute
}

func (jwd *jWDate) Set(t *time.Time) {
    if jwd.Time == nil {
        jwd.Time = t
    }
}