Как работает модульный код в Go? - PullRequest
11 голосов
/ 28 августа 2011

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

В 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, какова правильная структура проекта и как работает процесс компиляции?

Ответы [ 2 ]

21 голосов
/ 28 августа 2011

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

Модуляризация

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

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

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

Компиляция

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

0 голосов
/ 26 августа 2018

В дополнение к организации пакетов, как и pip в python, используйте dep https://github.com/golang/dep для управления пакетами go.если вы используете его в существующем пакете go, он автоматически создаст дерево зависимостей с версиями для всех используемых пакетов.при переходе на производственный сервер, dep sure будет использовать Gopkg.toml для установки всех необходимых пакетов.
Просто используйте dep обеспечить -add, другие команды для dep:

Commands:

    init     Set up a new Go project, or migrate an existing one
    status   Report the status of the project's dependencies
    ensure   Ensure a dependency is safely vendored in the project
    version  Show the dep version information
    check    Check if imports, Gopkg.toml, and Gopkg.lock are in sync

 Examples:
    dep init                               set up a new project
    dep ensure                             install the project's dependencies
    dep ensure -update                     update the locked versions of all dependencies
    dep ensure -add github.com/pkg/errors  add a dependency to the project
...