імпортування файлів go в ту саму папку


84

У мене виникають труднощі з імпортом локального файлу go в інший файл go.

Моя структура проекту схожа на щось нижче

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

Я намагаюся імпортувати a.go всередину b.go. Я спробував наступне,

import "a"
import "github.com/xxxx/a"

Жодне з них не спрацювало .. Я розумію, що мені доводиться втручатися в GOPATH, але я не зміг це правильно зрозуміти. На даний момент мій GOPATH вказує на samplego (/ workspace / samplego). Я отримую нижченаведену помилку

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

Крім того, як працює GOPATH, коли ці вихідні файли імпортуються в інший проект / модуль? Тоді місцевий імпорт буде проблемою? Яка найкраща практика в цьому випадку - це мати один файл go в модулі (з відповідними тестами)?


Будь-яка кількість файлів у каталозі є частиною одного пакету з самого початку. (І вони повинні мати однакову package aдекларацію вгорі.)
два два

Дякую @twotwotwo ... Не могли б ви повідомити мене, як вирішити вищезазначену проблему? Крім того, коли ми маємо файли multipe go в пакеті, імпорт повинен слідувати повному шляху, наприклад. github.com/xxxx/a або просто що б зробити
g0c00l.g33k

Для модулів Go файли в одному каталозі все ще є частиною одного пакету, все одно мають мати однакову назву пакета (наприклад, package foo) і все одно не потрібно безпосередньо імпортувати один одного. Ця відповідь охоплює це трохи більше для модулів Go, зокрема про те, як імпортувати пакети в тому самому модулі під модулями Go.
типовий182

Відповіді:


76

Будь-яка кількість файлів у каталозі - це один пакет; символи, заявлені в одному файлі, доступні для інших без будь-яких imports або кваліфікаторів. Для всіх файлів потрібна однакова package fooдекларація вгорі (або ви отримаєте повідомлення про помилку go build).

Вам потрібен GOPATHнабір в каталог , де ваші pkg, srcі binкаталоги проживають. Це лише питання переваг, але загальноприйнятим є наявність єдиного робочого простору для всіх ваших програм (іноді $HOME), а не одного для кожного додатка.

Зазвичай шлях Github був би github.com/username/reponame(не просто github.com/xxxx). Отже, якщо ви хочете мати mainще один пакет, ви можете в кінцевому підсумку зробити щось під workspace/srcподібним

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

Зверніть увагу, що ви завжди імпортуєте з повним github.com/...шляхом: відносний імпорт не дозволяється в робочій області. Якщо вам набридло друкувати шляхи, використовуйте goimports. Якщо у вас все вийшло go run, пора перейти на go build: runпогано торкається багатофайлових файлів main, і я не потрудився протестувати, але почув (від Дейва Чейні тут ) go runне відновлює брудні залежності.

Здається, ви принаймні намагалися встановити GOPATH як слід, тому, якщо ви все ще застрягли, можливо, включіть, як саме ви встановлюєте змінну середовища (команда тощо), і яку команду ви запускали, і яка помилка сталася. Ось інструкції щодо того, як його встановити (і зробити налаштування постійним) під Linux / UNIX, і ось порада команди Go щодо налаштування робочої області . Можливо, ні те, ні інше не допомагає, але погляньте і принаймні вкажіть, яка частина вас бентежить, якщо ви розгублені.


1
goimports був дуже корисним :)
g0c00l.g33k

Якщо у вас виникають проблеми із запуском декількох файлів в основному пакеті, див. Цю відповідь .
Рік Сміт,

Я додав ту саму package mainдекларацію до всіх файлів в одному каталозі, але у мене undefinedпомилка, я main.goне бачу функції з файлу, controllers.goщо знаходиться в тому ж каталозі.
аме

2
@AlexChaliy Якщо ви використовуєте go run, можливо, вам доведеться явно передати йому обидва імена файлів або перейти до того, щоб помістити їх у пакет у вашому GOPATH та ввести go buildйого. Також перевірте наявність типових помилок, не пов’язаних зі структурою пакету (наприклад, друкованого імені). Якщо нічого з цього не вирішить, я відкрию нове запитання з усіма деталями, які ви можете; може знадобитися багато обговорень того, як саме вирішують вашу директорію, файли тощо, і оскільки мова йтиме саме про вашу установку, нове питання здається найкращим місцем для цього.
twotwotwo

40

Ніякого імпорту не потрібно, якщо ви заявите і те, a.goі b.goодне в одному пакеті. Потім ви можете використовувати go runдля розпізнавання декількох файлів за допомогою:

$ go run a.go b.go

14

./main.go (в основному пакеті)
./a/a.go (у пакеті a)
./a/b.go (у пакеті a)

у цьому випадку:
main.go import "./a"

Він може викликати функцію в a.go та b.go, тобто з увімкненими першими літерами.


0

Я просто хотів щось дійсно елементарне, щоб перемістити деякі файли з головної папки, наприклад відповідь користувача2889485, але його конкретна відповідь не спрацювала для мене. Мені було все одно, були вони в одному пакеті чи ні.

Мій робочий простір GOPATH є c:\work\goі під цим я маю

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

в main.goI import "/pg/dbtypes"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.