英文:
Assign to nil pointer in receiver method
问题
我正在尝试在将使用JSON编码/解码的结构中使用time.Time
结构。如果time.Time
属性未设置,它们不应包含在内(使用omitempty标签),因此为了能够实现这一点,我将不得不使用指向time.Time
对象的指针。
我已经为time.Time
结构定义了一个类型,这样我就可以轻松地创建接收函数,以在编码和解码JSON时格式化时间等。
在这里可以看到代码:https://play.golang.org/p/e81xzA-dzz
因此,在我的主要结构(实际上将被编码的结构)中,我将这样做:
type EncodeThis struct {
Str string `json:"str,omitempty"`
Date *jWDate `json:"date,omitempty"`
}
问题是指针可能为nil,在尝试解码值时,因此如果您查看我在Go Playground上的代码,您会看到我正在尝试(使用双指针)设置接收器的地址,如果它为nil。请参阅"Set"和"swap"方法。
但是,这似乎不起作用。程序不会失败或出现任何错误,但"EncodeThis"结构将不包含对这个新地址的引用。有没有什么修复这个问题的想法?
英文:
I'm trying to use a time.Time
structure in a structure that will be encoded/decoded with JSON. The time.Time
attributes should not be included if they aren't set (omitempty tag), so to be able to do so I will have to use a pointer to the time.Time
object.
I have defined a type for the time.Time
structure so I easily can create receiver functions format the time when the JSON is encoded and decoded etc.
See the code here: https://play.golang.org/p/e81xzA-dzz
So in my main structure (the structure that actually will be encoded) I will do something like this:
type EncodeThis struct {
Str string `json:"str,omitempty"`
Date *jWDate `json:"date,omitempty"`
}
The problem is that the pointer may be nil, when trying to decode the value, so if you look at my code at the Go playground, you can see that I'm trying to (using double pointers) to set the address of the receiver if its nil. See method "Set" and "swap".
But, this doesnt seem to work. The program doesn't fail or anything, but the "EncodeThis" struct will not contain a reference to this new address. Any idea for a fix for this?
答案1
得分: 2
将你的日期对象包装在一个包含指向time.Time
对象的指针的结构体中。
// JWDate: 数字日期值
type jWDate struct {
date *time.Time
}
func (jwd *jWDate) Set(t *time.Time) {
if jwd.date == nil {
jwd.date = t
}
}
如果你需要从jWDate
结构体中访问time.Time
的方法,你可以将其嵌入。通过嵌入类型,你仍然可以轻松访问对象的指针:
// JWDate: 数字日期值
type jWDate struct {
*time.Time // 嵌入的`time.Time`类型指针,而不仅仅是一个属性
}
func (jwd *jWDate) Set(t *time.Time) {
if jwd.Time == nil {
jwd.Time = t
}
}
英文:
Wrap your date object with a struct containing a pointer to time.Time
object.
// JWDate: Numeric date value
type jWDate struct {
date *time.Time
}
func (jwd *jWDate) Set(t *time.Time) {
if jwd.date == nil {
jwd.date = t
}
}
If you need to have access to time.Time
methods from jWDate
struct you can embed it. With embedded type you still have ease access to an object's pointer:
// 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
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论