LINUX.ORG.RU

интерфейсы в GO

 , , ,


0

4

Читаю и не как понять не могу что такое интерфейсы в GO ??

можно пояснить

Есть только понимание что они работаю с некоторым количеством методов.



Последнее исправление: antonio-an (всего исправлений: 1)

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

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Примерно то же самое, что в джаве. Ну и везде, где есть интерфейсы.

Кажется, у тебя нет фундаменальных понятий, поэтому го учить матчасть с самых азов.

И где конкретика.

Мне кажется меня запутывают.

antonio-an
() автор топика

Интерфейс это список требований, которым, в случае ГО, должна отвечать структура (список методов, которые должны быть), чтобы работать единообразно с разными структурами.

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)

Интерфейс – фактически это протокол, по которому можно работать с объектом. В отличии от java и c#, где у интерфейсов номинальная типизация (определяется иерархией наследования), у интерфейсов golang типизация структурная (определяется составом методов и полей). Может из-за этого и непонимание.

amm ★★
()
Ответ на: комментарий от antonio-an

Прочитал - шума стало больше - не помогло.

Это не шум. Это та самая недостающая матчасть.

Zhbert ★★★★★
()

Интерфейс описывает поведение.

На пальцах – например что-то что может куда-то писать → т.е. «писатель» io.Writer

type Writer interface {
	Write(p []byte) (n int, err error)
}

будет описывать любую структуру умеющую писать. А в частности любую структуру имеющую метод Write(p []byte) (n int, err error)

Таким образом ты абстрагируешься от конкретного типа и вместо зоопарка

func writeToFile(f *os.File) error
func writeToBuf(b *bytes.Buffer) error
func writeToSocket(n *net.Conn) error

указываешь только поведение, независимое от конкретного типа:

func writeTo(w io.Writer) error

Ибо и os.File и bytes.Buffer и net.Conn и ещё 3000 десятков других структур могут быть «писателем».

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 5)
Ответ на: комментарий от beastie

Так тут нет поведения. Прост сигнатура, контракт. Поведение будет уже у конкретного типа

cobold ★★★★★
()

Интерфейс это способ сказать в коде что эта переменная или параметр является ссылкой на структуру у которой есть методы перечисленные в интерфейсе. Типа если у тебя в интерфейсе есть методы Beep() и Kill() и Paint(), то ты можешь передать например в функцию любую структуру у которой есть такие методы и внутри функции их вызывать

То есть совершенно то же самое что в жабе например (только в жабе ты должен явно сказать что класс реализует интерфейс, а в гошечке это необязательно

no-dashi-v2 ★★★★
()

заходишь ты в один магазин, говоришь продавцу что тебе нужно, он тебе дает товар, а ты ему деньги. За ходишь в другой\третий - тоже самое! вот сама концепция продавца и есть интерфейс, хотя сами продавцы могут быть разного пола\возраста и т.д. да и вообще роботом, но реализуют один интерфейс - интерфейс продавца. А вот сама идея, что ты пошел в магазин купить товар взаимодействуя с продавцом-интерфейсом – это уже контрактное программирование.

fpastush
()

Похоже на троллинг. Что там понимать? Такие же как и кругом, только есть ещё неявная реализация.

urxvt ★★★★★
()

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

masa ★★★
()
Последнее исправление: masa (всего исправлений: 1)
Ответ на: комментарий от masa

Возможность из скриптов обращаться к функциям других программ, ОС, ненужная хрень. Ну так-то да.

anonymous
()

в Го было хорошо и красиво сделано: интерфейс - это набор методов, которые должна реализовывать заданная структура.

Причем в отличие от явно специфицирования, как у бездарей в расте с их трейтами, здесь применяется утиная типизация. То есть если структура уже реализует все нужные методы, то ничего дополнительно указывать не нужно, язык примет ее в качестве заданного интерфейса. Поэтому в Го нет проблем объявлять интерфейсы прямо там, где они используются.

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

Lrrr ★★★★★
()
Ответ на: комментарий от Lrrr

Структурная типизация круто, спору нет. Но и номинальная иногда полезна бывает. К примеру, не всё, у чего есть метод shoot, можно испольховать для селфи.

Nervous ★★★★★
()
Ответ на: комментарий от Bad_ptr

С чистыми виртуальными методами. То есть без реализации.

Ну и данное определение применимо только к C++/Java, потому что завязано на наследовании. В Go есть интерфейс, но нет наследования.

kaldeon ★★
()
Ответ на: комментарий от kaldeon

Ну мы же тут объясняем человеку, которому непонятны интерфейсы на Го, а чтобы объяснить надо использовать другие образы, слова, языки…

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Ну мы же тут объясняем человеку, которому непонятны интерфейсы на Го, а чтобы объяснить надо использовать другие образы, слова, языки…

В менторском стиле.

antonio-an
() автор топика
Ответ на: комментарий от Lrrr

начали фигачить дженерик

Которые настолько несовместимы с Го, что выход дальше параметра функции превращается в набор не очевидных проблем. А иногда и с параметрами функции так же.

И вы пишете, пишете, пишете на этих вот генериках. Понимаете, что это нерабочее что-то. Удаляете. И пишите без них. В состоянии абсолютного счастья.

thegoldone ★★★
()
Ответ на: комментарий от amm

Не понимаю негодования. Сейчас даже в php и python есть дженирики

ну вот пусть эти чудики и пишут на пыхах с питонами, сюда-то они нафиг полезли? Чтобы превратить го в очередное бездарное неюзабельное нечто?

Lrrr ★★★★★
()

В Горшке интерфейс — это просто набор методов.

Любой тип реализует интерфейс без методов (interface{}).

Тип, имеющий метод String() string реализует интерфейс interface{ String() string }, или, например, fmt.Stringer.

В одном интерфейсе может быть несколько методов. Так же он может включать в себя другие интерфейсы.

Неверно начинать проектирование приложения с интерфейсов. Как правило интерфейсы выявляются позже. При определённом наборе пересекающихся наборов методов у разных типов.

Технически — это структура вида {тип, значение} (или указатели).

Преобразование объекта в интерфейс может привести к выносу этого объекта в кучу.

thegoldone ★★★
()
Ответ на: комментарий от amm

Го намного сильнее многих других ЯП. В первую очередь потому что изначально он хорошо проработан. А не детсадовская поделка вида: ЯП — это набор фич.

thegoldone ★★★
()
Последнее исправление: thegoldone (всего исправлений: 3)
Ответ на: комментарий от amm

Генерация кода, any, рефлексия. Неудобно.

Авторы языка, ЕМНИП, никогда не были против дженериков. Они их просто честно не знали как сделать, как совместить с другими особенностями языка, и были заняты решением других проблем.

Мне кажется, никто не знал как их сделать. Знали, конечно, как их сделать в Java или C++, потому что там они уже есть. Но Go — другой язык и подход дженериков должен быть свой.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от Aceler

Чот там хобот совсем не в ту степь полез объяснять с картинками.

Все же просто:

Интерфейс — это декларативное утверждение того, что может функция/класс, но не показывает, как оно это делает.

Функция/класс — это реализация/имплементация фактических внутренностей того, что заявлено в интерфейсе.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Идея в том, что объяснять много десятками способов. Я привёл один из. Возможно, кому-то зайдёт другой. В любом случае, пока не попробуешь, не поймёшь.

Aceler ★★★★★
()

Тебя забанили в гугле, яндексе, бинге, дакдакго и всех ai чатах, что столь простой вопрос надо задавать на ЛОР-е, дёргая живых людей? Плюс-минус тоже самое, что и интерфейсы в других ЯП (синтаксис и некоторые нюансы, вроде встраивания могут отличаться от ЯП к ЯП, но суть и задача у них одна и та же - обеспечивать полиморфизм), в случае го это специальный тип не имеющий реализации.

anonymous
()
Ответ на: комментарий от Lrrr

А как коллекции и операции с ними делать без дженериков? Тип объектов которые туда будут класть неизвестен, потому что откуда я как автор библиотеки должен знать, какую фигню ты будешь вытворять с кодом? Не, можно конечно по старинке, как в сишке с препроцессором или _Generic (С11 и новее) сексом заниматься. Но зачем?

anonymous
()
Ответ на: комментарий от kaldeon

Генерация кода - неудобно, иногда сложно, так уж если код генерить надо чтоб какой-то препроцессор был и желательно удобный и полноценный, скажем питон, но это вместо одного ЯП 2 выходит. Рефлексия не только не удобно, но ещё и на этапе компиляции не вылезет что какое-то говно происходит. Жопа будет прям в рантайме, что добавляет радости с тестами и отладкой кода. Ну нафиг.

anonymous
()
Ответ на: комментарий от urxvt

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

amm ★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария