Могу ли я использовать интерфейс в качестве параметра при написании функции, которая может в конечном итоге передать любую структуру? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать функцию, которая может в конечном итоге принять любую структуру ... допустим, это так:

func setDate(s timestamp, data interface{}){
    data.Date = timestamp
}

Я понимаю, что мне не нужна функция для установкиэто значение в реальной жизни, я пытаюсь узнать больше о том, как работают интерфейсы и т. д.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете подойти к нему таким образом, но тогда внутри 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...