Задать вопрос
@AnonymFromInternet

Go. Как у экземпляра структуры получить доступ к методам самой структуры, но не к методам интерфейса?

Интерфейс
type Jumping interface {
   Jump()
}


Структура
type User struct {
 Name string
 Surname string
}


Метод самой структуры
func (user *User) Swim() { }

Имплементация метода интерфейса
func (user *User) Jump() { }

Функция, создающая новый экземпляр интерфейса Jumping
func newUser(name, surname string) *Jumping {
  return &User{ name, surname }
}


Экземпляр интерфейса Jumping
jeniffer := newUser("Jeniffer", "Sullivan")

Теперь у jeniffer можно обращаться к методу Jump().

Как мне обратиться к методу Swim() у jeniffer ?
Вроде это осуществляется при помощи type assertion, если я ничего не путаю. Но как именно ?

Спасибо
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@micronull
У вас изначально не правильно сделано.
newUser это конструктор и должен возвращать объект структуры User.

И уже там где вам нужен именно `Jump` метод описывайте тип переменной которая является имплементацией интерфейса `Jumping`.

Однако проверить что переменная является экземпляром нужной структуры так же можно.

package main

type Jumping interface {
	Jump()
}

type User struct {
	Name string
	Surname string
}

func (user *User) Swim() { }

func (user *User) Jump() { }

func NewUser(name, surname string) *User {
	return &User{ name, surname }
}

func main() {
	u := NewUser("Ivan", "Ivanov")

	FooBar(u)
}

func FooBar(j Jumping) {
	j.Jump()

	if u, ok := j.(*User); ok {
		u.Swim()
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы