Преобразование типов между двумя указателями структур - PullRequest
0 голосов
/ 25 мая 2019

У меня есть 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.

1 Ответ

0 голосов
/ 28 мая 2019

Проблема в неоднозначном синтаксисе *T(v) или чего-либо еще, что вы там пробовали.Спецификация Golang дает полезные примеры для преобразования типов, такие как:

*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to *Point

Для этого, поскольку необходим *Point, следует использовать *T(v).

...