Лучший способ организовать интерфейс Go - PullRequest
6 голосов
/ 22 мая 2010

Прошло много времени с тех пор, как я программировал на C ++, но я знаю, что в C ++ классы организованы в файлы .h и .cpp. Также многие другие языки выигрывают от разделения кода на логические группировки в структуре каталогов для улучшения организации.

Ну, я пытаюсь выучить Go сейчас, и я перечитывал статью Go для C ++ Programmers , когда сталкивался с интерфейсами. В статье объясняется, что интерфейсы в Go по сути занимают место классов, и показано, как их настроить довольно хорошо.

Что я пытаюсь выяснить, как организовать интерфейс в файлы? Например, должен ли интерфейс находиться в одном файле, а реализация в другом?

myInterface.go

type myInterface interface {
    get() int
    set(i int)
}


myImplementation.go

type myType struct { i int }
func (p *myType) set(i int) { p.i = i }
func (p *myType) get() int { return p.i }

Мой код здесь может быть неправильным, так как я еще не полностью знаю, что я делаю (и если я ошибаюсь, пожалуйста, исправьте меня), но будет ли это лучшим способом настроить это? У меня очень тяжелые времена, когда я пытаюсь понять, как организовать код в Go, так что любая помощь приветствуется!

Метрополис

Ответы [ 2 ]

7 голосов
/ 22 мая 2010

Нет необходимости помещать типы и интерфейсы в отдельные файлы. Вещи, экспортируемые из каждой упаковки , имеют значение, и вы обозначаете их, начиная имя с заглавной буквы. В C & Co. имеет значение то, что входит в заголовочный файл, потому что это «импортировано» (включено). В Go это пакет, который импортируется, и не имеет значения, как его содержимое организовано в разные исходные файлы (он все равно не будет виден импортеру).

Моя личная рекомендация - избегать создания ненужных файлов. Если код относительно короткий, храните его в одном файле. Если он длинный, подумайте о том, чтобы разделить части, для которых это кажется естественным (например, интерфейс + связанные функции, которые, вероятно, будут образовывать отдельный класс, если вы делаете это в Java или C ++). Не отделяйте ничего только ради отделения определений от кода; в Go это не имеет смысла, хотя и в C.

5 голосов
/ 22 мая 2010

Язык программирования Go не является ни C ++, ни Си. Подходите к нему как к новому языку.Go не имеет эквивалента для заголовочных файлов.Он имеет слабую связь с концепцией классов C ++.Поскольку вы не являетесь опытным программистом C ++, игнорируйте статью Go For C ++ Programmers .

Начните с чтения Учебное пособие по языку программирования Go .Затем прочитайте Effective Go .Просмотрите Спецификация языка программирования Go , чтобы вы знали, где искать.

Go - это открытый исходный код, так что посмотрите настоящую документацию по пакету Go и исходный код .

Для начала посмотрите на time пакет документации и исходный код , который был написан авторами Go.Они не используют отдельные файлы для объявлений и реализации интерфейса, так почему вы хотите?Как вы говорите сами, вы еще не знаете, что делаете, так почему бы не начать с следования примеру экспертов?

Некоторые мотивы для разработки языка программирования Go возникли из желаниясоздать язык, который был бы лучше, чем C, и намного проще, чем C ++.Принимая во внимание процедурные характеристики (часто похожие на C) Go, такие концепции процедурного проектирования, как сцепление и сплоченность, полезны.Эти концепции очевидны при разбиении пакета Go time на несколько исходных файлов.Некоторые концепции проектирования классов также будут полезны, но помните, что Go не поддерживает наследование.

Как отметил Никлаус Вирт в своей классической статье «Разработка программ путем поэтапного уточнения», ранние черновики программы редко бывают идеальными, возможнодаже небрежный иногда.Даже финальная версия редко бывает идеальной.Например, авторы Go спустя всего несколько месяцев недавно переписали пакет Go json.

Конструкция и реализация языка программирования Go позволяет использовать множество небольших функций.Это одобряет сжатые решения.Конечно, многие функции не предоставляются за пределами пакета.Произвольные ограничения на размер или количество функций редко работают на любом языке. Программы

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

Что хочет сделать ваш первый пакет Go?Задайте конкретные вопросы, на которые можно ответить, и предоставьте детали.

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