Примерно то же самое, что в джаве. Ну и везде, где есть интерфейсы.
Кажется, у тебя нет фундаменальных понятий, поэтому го учить матчасть с самых азов.
Интерфейс это список требований, которым, в случае ГО, должна отвечать структура (список методов, которые должны быть), чтобы работать единообразно с разными структурами.
Интерфейс – фактически это протокол, по которому можно работать с объектом. В отличии от java и c#, где у интерфейсов номинальная типизация (определяется иерархией наследования), у интерфейсов golang типизация структурная (определяется составом методов и полей). Может из-за этого и непонимание.
Интерфейс это способ сказать в коде что эта переменная или параметр является ссылкой на структуру у которой есть методы перечисленные в интерфейсе. Типа если у тебя в интерфейсе есть методы Beep() и Kill() и Paint(), то ты можешь передать например в функцию любую структуру у которой есть такие методы и внутри функции их вызывать
То есть совершенно то же самое что в жабе например (только в жабе ты должен явно сказать что класс реализует интерфейс, а в гошечке это необязательно
заходишь ты в один магазин, говоришь продавцу что тебе нужно, он тебе дает товар, а ты ему деньги. За ходишь в другой\третий - тоже самое! вот сама концепция продавца и есть интерфейс, хотя сами продавцы могут быть разного пола\возраста и т.д. да и вообще роботом, но реализуют один интерфейс - интерфейс продавца. А вот сама идея, что ты пошел в магазин купить товар взаимодействуя с продавцом-интерфейсом – это уже контрактное программирование.
Не советую забивать себе голову этими сектансткими идеями, они далеки от настоящего программирования, больше теория для тех кто любит все усложнять. Может придуманная, чтобы тупые не могли программировать.
в Го было хорошо и красиво сделано: интерфейс - это набор методов, которые должна реализовывать заданная структура.
Причем в отличие от явно специфицирования, как у бездарей в расте с их трейтами, здесь применяется утиная типизация. То есть если структура уже реализует все нужные методы, то ничего дополнительно указывать не нужно, язык примет ее в качестве заданного интерфейса. Поэтому в Го нет проблем объявлять интерфейсы прямо там, где они используются.
Но сейчас Го сдался, туда пришли эффективные манагеры и начали фигачить дженерики во все поля, превращая язык в ненужную каку вроде раста. RIP.
Структурная типизация круто, спору нет. Но и номинальная иногда полезна бывает. К примеру, не всё, у чего есть метод shoot, можно испольховать для селфи.
Которые настолько несовместимы с Го, что выход дальше параметра функции превращается в набор не очевидных проблем. А иногда и с параметрами функции так же.
И вы пишете, пишете, пишете на этих вот генериках. Понимаете, что это нерабочее что-то. Удаляете. И пишите без них. В состоянии абсолютного счастья.
Любой тип реализует интерфейс без методов (interface{}).
Тип, имеющий метод String() string реализует интерфейс interface{ String() string }, или, например, fmt.Stringer.
В одном интерфейсе может быть несколько методов. Так же он может включать в себя другие интерфейсы.
Неверно начинать проектирование приложения с интерфейсов. Как правило интерфейсы выявляются позже. При определённом наборе пересекающихся наборов методов у разных типов.
Технически — это структура вида {тип, значение} (или указатели).
Преобразование объекта в интерфейс может привести к выносу этого объекта в кучу.
Авторы языка, ЕМНИП, никогда не были против дженериков. Они их просто честно не знали как сделать, как совместить с другими особенностями языка, и были заняты решением других проблем.
Мне кажется, никто не знал как их сделать. Знали, конечно, как их сделать в Java или C++, потому что там они уже есть. Но Go — другой язык и подход дженериков должен быть свой.
Тебя забанили в гугле, яндексе, бинге, дакдакго и всех ai чатах, что столь простой вопрос надо задавать на ЛОР-е, дёргая живых людей? Плюс-минус тоже самое, что и интерфейсы в других ЯП (синтаксис и некоторые нюансы, вроде встраивания могут отличаться от ЯП к ЯП, но суть и задача у них одна и та же - обеспечивать полиморфизм), в случае го это специальный тип не имеющий реализации.
А как коллекции и операции с ними делать без дженериков? Тип объектов которые туда будут класть неизвестен, потому что откуда я как автор библиотеки должен знать, какую фигню ты будешь вытворять с кодом? Не, можно конечно по старинке, как в сишке с препроцессором или _Generic (С11 и новее) сексом заниматься. Но зачем?
Генерация кода - неудобно, иногда сложно, так уж если код генерить надо чтоб какой-то препроцессор был и желательно удобный и полноценный, скажем питон, но это вместо одного ЯП 2 выходит. Рефлексия не только не удобно, но ещё и на этапе компиляции не вылезет что какое-то говно происходит. Жопа будет прям в рантайме, что добавляет радости с тестами и отладкой кода. Ну нафиг.
Ты не словил фейспалм в начале изучения от неявного владения памятью и еще что еще хуже неявного копирования? И это в достаточно молодом языке, то есть сделано сознательно.