Свойство Go Interface не определено - PullRequest
0 голосов
/ 14 мая 2019

У меня есть особая проблема, когда мне нужна переменная, которая может принимать значение той или иной структуры. Я создаю структуру userResp с пользовательским полем, которое имеет значение интерфейса, но если я добавлю функцию, которая возвращает дочернее свойство пользователя с именем Password, возвращает ошибку. Значением user будет структура со свойством Password.

Структура:

type userResp struct {
  user interface{}
}

функция

func (ur *userResp) password() string {
  return ur.user.Password
}

Я получаю ur.user.Password undefined (type interface {} is interface with no methods), но интерфейс user может быть структурой Admin или User с полем Password.

Любая идея, как это сделать, мне нужно работать со структурой пользователя или администратора и вернуть его.

Я не могу использовать 2 функции, потому что логика одинакова в обоих случаях. Мне нужна вся структура пользователя или администратора

1 Ответ

5 голосов
/ 14 мая 2019

Здесь есть несколько проблем:

Вы не можете вызвать метод для пустого интерфейса (interface{}), потому что пустой интерфейс не имеет методов, определенных.

Вы можетене ссылаться на поля через тип интерфейса, только методы.

Вам необходимо определить, какое поведение должно иметь значение, установленное в качестве значения user, и определить интерфейс, отражающий это.Например, если единственное, что вам нужно, чтобы пользователь мог сделать, это предоставить пароль, интерфейс будет

type User interface {
    Password() string
}

Тогда ваша структура будет

type userResp struct {
  user User
}

Вы бызатем верните пароль следующим образом:

return ur.user.Password()

Для любых типов, которые вы хотите сохранить в поле user, должен быть определен метод Password, чтобы они удовлетворяли интерфейсу User

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...