【问题标题】:Assign to nil pointer in receiver method在接收器方法中分配给 nil 指针
【发布时间】:2017-07-30 05:05:04
【问题描述】:

我正在尝试在将使用 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 操场上查看我的代码,你可以看到我正在尝试(使用双指针)设置地址如果它为零,则接收者的。参见方法“Set”和“swap”。

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

【问题讨论】:

  • 您的游乐场不完整。请将其修复为可编译状态。
  • 问题在于它的数千行代码,以及很多依赖项。问题出在方法 Set 上,此时接收者指针为 nil。我需要在 Set 方法中为其分配内存或重新分配地址。但我不知道该怎么做。或者如果它真的可能。最坏的情况是我需要在创建时为它们创建内存,但是将它作为指针是没有用的。
  • 我有个主意。请看我的回答,我相信它会有所帮助。

标签: pointers go null


【解决方案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
    }
}

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

// 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
    }
}

【讨论】:

  • 谢谢。但我必须重新设计我处理这个问题的方式,这与你的处理方式相似。我将jWDate-结构扩展为简单地拥有New() 方法,该方法分配内存(由程序员实际使用它需要)以确保内存地址不会被任何其他go-routine改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2019-06-26
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多