Помилка "не вдається завантажити пакет: пакет my_prog: знайдені пакети my_prog та main"


75

У моєму GOPATH у мене є щось подібне:

/bin/
/pkg/
/src/
/src/my_prog/
/src/my_prog/main.go
/src/my_prog/d_interface.go
/src/my_prog/d_struct_that_implements_the_interface.go

В main.goмаю package main, в d_interface.goі d_struct_that_implements_the_interface.goмаю package my_prog.

При спробі go build my_progотримати таку помилку:

can't load package: package my_prog: found packages my_prog (d_interface.go) and main (main.go) in C:\dev\Code\Go\src\my_prog

Чи означає це, що будь-який файл, який належить, package mainповинен знаходитись у власній папці? Якщо так, то в чому причина цього?

Відповіді:


77

Так, кожен пакет повинен бути визначений у власному каталозі.

Структура джерела визначена в Як писати код Go .

Пакет - це компонент, який можна використовувати в декількох програмах, який можна публікувати, імпортувати, отримувати з URL-адреси тощо. Тому має сенс мати свій власний каталог стільки, скільки програма може мати каталог.


Так, але чи відповідає пакет main main як незалежний пакет? Наскільки я розумію, пакет main - це химерність мови, яка забезпечує точку входу (подібно до класів Java, які мають загальнодоступний статичний main).
TheTeaMan

Так, це як це працює. На практиці я вкладаю в свій "основний" пакет дуже мало коду, лише той, який не можна використовувати в інших програмах.
Denys Séguret

8
Це досить прикро, якщо бути відвертим. Я не бачу причини відокремлювати головну точку входу від решти програми. Я прийму цю відповідь.
TheTeaMan

Коли я роблю програму, у мене часто буває багато дрібних утиліт, що використовують одні й ті самі дані / модель / і т. Д. Зручно розбивати все на пакети, і всі програми мають дуже маленькі розміри і використовують ці пакети. До речі, ви можете трохи почекати, перш ніж прийняти відповідь, щоб інші користувачі мали стимул дати вам інші (можливо, кращі) відповіді.
Denys Séguret

2
Я ще нічого не намагаюся встановити, лише будую програму. Програма залежить від обох пакетів. Я з’ясував, що введення основного пакета /src/my_prog/та пакета my_prog /src/my_prog/my_prog/працює.
TheTeaMan

17

Крім того, якщо все, що ви намагаєтесь зробити, - це розбити файл main.go на кілька файлів, тоді просто назвіть інші файли "основним пакетом", якщо ви лише визначите основну функцію в одному з цих файлів, вам буде добре піти.


2

Переконайтеся, що ваш пакет встановлений у вашому $GOPATH каталозі або вже у вашій робочій області / пакеті.

Наприклад: якщо ваш $GOPATH = "c:\go", переконайтеся, що пакет всерединіC:\Go\src\pkgName

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