Вы можете подойти к нему таким образом, но тогда внутри setDate()
вам потребуется использовать отражение, чтобы установить поле Date
.Go является статически типизированным языком, поэтому, если (статический) тип data
равен interface{}
(что ничего не говорит об этом), вы не сможете ничего с ним сделать полезного (вы не можете ссылаться на его * 1005).* поле, потому что нет гарантии, что его значение имеет поле Date
.
Вместо этого вы должны определить интерфейс HasDate
, который содержит один метод:
type HasDate interface {
SetDate(s time.Time)
}
Возможность установить дату.И ваша функция должна ожидать значение этого типа интерфейса:
func setDate(s time.Time, data HasDate) {
data.SetDate(s)
}
Любой, кто реализует этот интерфейс HasDate
, может быть передан вашей функции setDate()
.Обратите внимание, что в Go реализация интерфейсов неявна: нет объявления о намерениях.Это означает, что любой тип, имеющий метод SetDate(time.Time)
, реализует этот интерфейс HasDate
, даже не зная, что этот интерфейс существует.
Это пример типа, который реализует его (точнее, его указатель *MyType
):
type MyType struct {
date time.Time
}
func (mt *MyType) SetDate(s time.Time) {
mt.date = s
}
Пример тестирования (попробуйте на Go Playground ):
mt := &MyType{}
setDate(time.Now(), mt)
fmt.Println(mt.date)