我有一个struct
,它由一个自定义time.Time
定义,这是为了遵循this answer的建议,它具有一个自定义MarshalJSON()
接口:
type MyTime time.Time
func (s myTime) MarshalJSON() ([]byte, error) {
t := time.Time(s)
return []byte(t.Format(`"20060102T150405Z"`)), nil
}
我用MyStruct
类型的ThisDate
和ThatDate
字段定义了*MyTime
类型:
type MyStruct struct {
ThisDate *MyTime `json:"thisdate,omitempty"`
ThatDate *MyTime `json:"thatdate,omitempty"`
}
据我了解,我需要使用*MyTime
而不是MyTime
,所以当我omitempty
的变量时,MarshalJSON
标签会起作用根据{{3}}的建议进行输入。
我使用的库的功能可以返回struct
,其中某些字段的类型为*time.Time
:
someVar := Lib.GetVar()
我试图这样定义MyStruct
类型的变量:
myVar := &MyStruct{
ThisDate: someVar.ThisDate
ThatDate: someVar.ThatDate
}
自然,它给了我一个编译错误:
cannot use someVar.ThisDate (variable of type *time.Time) as *MyTime value in struct literal ...
我尝试使用someVar.ThisDate
/ *
进行&
的类型转换,而没有这些则没有运气。我认为以下方法会起作用:
myVar := &MyStruct{
ThisDate: *MyTime(*someVar.ThisDate)
ThatDate: *MyTime(*someVar.ThatDate)
}
但这给了我一个不同的编译错误:
invalid operation: cannot indirect MyTime(*someVar.ThisDate) (value of type MyTime) ...
似乎我可能对Go中的指针和取消引用缺乏基本的了解。不管怎样,我想避免为我的问题找到一个具体的解决方案,而这只能归结为使omitempty
生效和自定义MarshalJSON
的需要。
答案 0 :(得分:0)
问题是*T(v)
或您在此尝试过的任何其他语法都模棱两可。 Golang's spec给出了有关类型转换的有用示例,引述如下:
*Point(p) // same as *(Point(p))
(*Point)(p) // p is converted to *Point
因此,由于需要*Point
,因此应使用*T(v)
。