Как работает модульный код в Go?

Не имея выходных данных из языка C/compiled, мне сложно справиться с использованием механизма Go packages для создания модульного кода.

В Python, чтобы импортировать модуль и получить доступ к нему, функции и многое другое, это простой случай

import foo

где foo.py - это имя модуля, который вы хотите импортировать в том же каталоге. В противном случае вы можете добавить пустой __init__.py в подпапку и получить доступ к модулям через

from subfolder import foo

Затем вы можете обращаться к функциям, просто ссылаясь на них через имя модуля, например. y = foo.bar(y). Это позволяет легко отделять логические фрагменты кода друг от друга.


В Go, однако, вы указываете имя пакета в самом исходном файле, например.

package foo

в верхней части модуля 'foo', который затем можно импортировать через

import (
        "foo"
              )

а затем обратиться к нему через это, т.е. y := foo.Bar(x). Но то, что я не могу оборачивать, - это то, как это работает на практике. Соответствующие документы на golang.org кажутся краткими и направлены людям с большим опытом (любым) с использованием make файлов и компиляторов.

Может кто-нибудь, пожалуйста, ясно объяснить, как вы собираетесь модулизовать свой код в Go, правильную структуру проекта для этого и как работает процесс компиляции?

Ответ 1

Ответ на Wiki, пожалуйста, не стесняйтесь добавлять/редактировать.

Модульность

  • Несколько файлов в одном пакете

    • Это то, на что похоже. Куча файлов в том же каталоге, который начинается с одной и той же директивы package <name>, означает, что они рассматриваются как один большой набор кода Go. Вы можете прозрачно вызывать функции в a.go от b.go. Это в основном для организации кода.
    • Вымышленным примером может быть пакет "блог", который может быть выложен с помощью blog.go (основного файла), entry.go и server.go. Это вам. Хотя вы можете написать блог-пакет в одном большом файле, это имеет тенденцию влиять на читаемость.
  • Несколько пакетов

    • Стандартная библиотека выполняется таким образом. В основном вы создаете модули и, возможно, устанавливаете их в $GOROOT. Любая программа, которую вы пишете, может import "<name>", а затем вызвать <name>.someFunction()
    • На практике любые автономные или общие компоненты должны быть скомпилированы в пакеты. Вернемся к предыдущему блогу. Если вы хотите добавить ленту новостей, вы можете реорганизовать server.go в пакет. Тогда оба blog.go и news.go будут оба import "server".

Компиляция

В настоящее время я использую gomake с Makefile. Установка Go включает в себя некоторые замечательные файлы include, которые упрощают создание пакета или команды. Это не сложно и лучший способ ускориться с ними - просто взглянуть на образцы make файлов из проектов с открытым исходным кодом и прочитать "Как написать код перехода" .