У меня есть struct
, который состоит из пользовательского time.Time
, определенного для того, чтобы иметь пользовательский интерфейс 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
переменную этого типа, после этого ответа предложение.
Я использую библиотеку с функцией, которая возвращает мне 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 ...
Я пробовал Typecasting 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
.