2016-05-18 2 views
1

Я изучаю язык Go, и я сделал этот пример: http://thenewstack.io/make-a-restful-json-api-go/ для создания простого API REST.Схема GoLang и пакетов с относительными путями

Я скомпилировал его, и все работает нормально, но все источники находятся в основном пакете.

Теперь я хочу, чтобы организовать мои .go файлы в пакетах, так что я переместить их в несколько папок таким образом:

GOPATH\bin 
GOPATH\pkg 
GOPATH\src\pack1\Handlers.go 
GOPATH\src\pack1\Logger.go 
GOPATH\src\pack1\repo.go 
GOPATH\src\pack1\Todo.go 
GOPATH\src\router\Router.go 
GOPATH\src\router\Routes.go 
GOPATH\src\Main.go 

Main.go использует весь маршрутизатор пакет, так что я положил в разделе импорта : "./router". Router.go использует пакет pack1, поэтому в Router.go я импортировал «../pack1». Теперь, если я пытаюсь «идти строить Main.go» я получаю:

router\Router.go:6: imported and not used: "_/D_/GOPATH/src/pack1" 
router\Router.go:14: undefined: Logger 

и подобные ошибки, поэтому кажется, что импорт пакета pack1, что я сделал, это неправильно. Конечно, во всех файлах, принадлежащих pack1, в заголовке я поставил определение «package pack1».

Я также читал, что относительный импорт не предлагается в Go, и было бы полезно использовать удаленные пакеты, такие как импорт github.com/myrepo/mypackage. Но я не хочу использовать удаленный импорт; Я хочу вытолкнуть все мои файлы в другой момент.

Не могли бы вы помочь мне лучше понять, каков способ локального импорта между пакетами на языке Go?

заранее спасибо

+2

Read (или перечитать) через [Как писать Перейти код ] (https://golang.org/doc/code.html), который будет объяснять все более подробно. – JimB

+1

Обратите внимание, что ошибки читаются как «импортированные и не используемые», поэтому запрос на импорт работал, но вы не использовали символ пакета pack1. Это относится к следующей ошибке «undefined: Logger»: если 'Logger' живет в пакете pack1, чем вы ссылаетесь на него из любого другого пакета как' pack1.Logger'. Перечитайте «Как написать код перехода» и взгляните на некоторые рабочие пакеты в Интернете. – Volker

+0

Спасибо, ребята за ответ, теперь я понял, как правильно импортировать пакеты! Таким образом, это также проще!У меня есть последний вопрос: я до сих пор не могу скомпилировать проект: внутри Router.go есть экземпляр Logger, поэтому в Router.go я импортировал пакет «pack1», но он говорит, что Logger undefined: \ where am I делать не так? –

ответ

4

Причины вы не должны использовать относительный импорт является то, что они не работают внутри $GOPATH. Избавиться от «относительных» частей ваших импортных путей, так как весь импорт по сравнению с $GOPATH/src

import (
    "pack1" 
    "router" 
) 

Вы также хотите, чтобы переместить Main.go в пакет, а также, так что вы можете сделать в полной мере использовать идти инструменты.

+0

Спасибо, человек! Теперь я понял, и весь мой импорт в порядке! :) И если из Router.go я вызываю функцию, определенную в файле .go внутри пакета1, что я могу сделать? Я импортировал пакет1 из Router.go, но когда я пытаюсь «перейти на установку», он говорит, что функция не определена ...: \ Спасибо заранее –

+0

Проблема решена, имя пакета отсутствовало до того, как я использую класс из другой упаковка. –

0

Как говорит JimB, прочитать «Как написать идти кода» ссылку, в частности https://golang.org/doc/code.html#ImportPaths

  • Все пакеты существуют внутри дерева каталогов, начиная с $ GOPATH/ЦСИ.
  • Путь импорта фактически полный путь к упаковке (от 1)
  • В GO нет подпакетов.
  • основные пакеты используются для создания команды

Так что в вашем случае, ваши пути импорта будут «pack1» и «маршрутизатор»

Смежные вопросы