функція "undefined" golang, оголошена в іншому файлі?


135

Я намагаюся написати базову програму go, яка викликає функцію в іншому файлі, але частину того ж пакету. Однак він повертає:

undefined: NewEmployee

Ось вихідний код:

main.go:

package main

func main() {
emp := NewEmployee()    
}

employee.go:

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}

чи мають ваші файли заяви про пакет? Те, що ви ввели, не має, а package xтакож ваш основний пакет містить лише один файл, а потім імпортує інші необхідні йому фрагменти
Chris Pfohl

8
ти використовуєш go run? (і див. golang.org/doc/code.html )
JimB

1
@JuanM, моє запитання було те, що повне джерело main.goі employee.go? Тому що всі файли запуску повинні мати виписку про пакет, а я не бачу жодного у вашому. Дивіться: golang.org/doc/code.html#PackageNames
Chris Pfohl

1
Остання функція співробітника.go помиляється (не вказано ім'я функції, не вказано тип повернення). Це не проблема, яку ви просите, але це показує, що проблем більше. Чи можете ви опублікувати повний код та повну помилку під час компіляції?
siritinga

1
то покажіть нам, що ви робите! GOPATH, фактичний код та те, як ви викликаєте goінструмент.
JimB

Відповіді:


172

Будь ласка, прочитайте "Як записати код" .

Не використовуйте /srcу своєму GOPATH. Пакети розташовані в $GOPATH/src.

Для buildабо installвам потрібно мати свої файли в каталозі пакунків.

Для цього go runвам потрібно надати всі аргументи як аргумент:

go run main.go employee.go

Але, ви майже завжди повинні використовувати go installабо go build(краще, колишній, як go buildвикликає плутанину при роботі з не основними пакетами)


дякую за вклад @JimB! Я редагував змінні середовища (я також забув встановити GOBIN), перемістив свої файли в потрібне місце, але все ж, коли я намагаюся зайти в інсталяцію, я отримую ту ж помилку. Будь-які пропозиції?
Хуан М

Ви впевнені, що інших помилок немає? Файл співробітника.go неможливо зібрати так, як є. Інакше мені потрібно точно побачити , що ти робиш. Точні шляхи, виклик тощо
JimB

8
Або $ go run * .go
Пуран

робити запуск $ go run *.goбуде ярликом замість запуску всіх файлів
Offerni

60

У мене просто була така ж проблема в GoLand (це Intellij IDEA для Go) і я розробив рішення. Вам потрібно змінити Run kindз Fileна на Packageабо Directory. Ви можете вибрати це зі спадного меню, якщо ви перейдете до Run/EditКонфігурації.

Наприклад: для упаковки ~/go/src/a_package, використовувати Package pathв a_packageі Directoryз ~/go/src/a_packageі Run kindв Packageабо Directory.


1
Дякую, саме це я шукав. Зауважте, що ваша відповідь стосується Intellij IDEA.
ківагант

13

Якщо ви використовуєте go run, зробіть go run *.go. Він автоматично знайде всі запущені файли в поточному робочому каталозі, складе і запустить вашу основну функцію.


Чи є якісь недоліки зробити це таким чином? Це здається найпростішою відповіддю на питання ОП.
Stavros_S


8

Ви можете спробувати одне з наступних.

Спосіб 01 : припустимо, що назва вашого проекту єMyProject

  • перейти до вас шлях, введіть go buildі натисніть клавішу Enter.
  • він створить виконуваний файл як назву вашого проекту ("MyProject")
  • потім введіть тип терміналу ./MyProjectі натисніть клавішу Enter

ви можете зробити обидва кроки одночасно, ввівши go build && ./MyProject. він запустить ваш проект належним чином з усімаgo файлами.

Спосіб 02

просто введіть go run *.goі натисніть Enter. це виконає всі ваші go files.

Сподіваюсь, це комусь допоможе.


4

Якщо ви хочете викликати функцію з іншого файлу запуску, а ви використовуєте Goland, то знайдіть опцію "Редагувати конфігурацію" у меню "Виконати" та змініть вид запуску з "Файл" у "Каталог". Він очищує всі помилки та дозволяє викликати функції з інших файлів go.


1

Я зіткнувся з тим же питанням і з Go11 , просто хотів поділитися тим, як я її вирішив, щоб допомогти іншим на випадок, якщо вони натрапляють на ту саму проблему.

У мене був проект Go назовні $GOPATH , тому мені довелося ввімкнути GO111MODULE=onцю опцію, не включивши цю опцію, це дасть вам це питання; навіть якщо ви намагаєтеся побудувати або перевірити весь packageабо directoryвона не буде вирішена безGO111MODULE=on


1

вам слід використовувати модулі go зараз, якщо ви не дотримуєтесь цього Як написати код go

З модулем go вам не потрібно вводити код у $ GOPATH / src. він також може жити в будь-якому іншому місці.

Ви можете перемістити код в інший каталог, як / співробітник, щоб змусити його працювати Тільки під каталогом службовців ініціалізувати модуль go

go mod init example.com/employee

0

Якщо ваша папка джерела структурована / go / src / blog (припускаючи, що назва вашої вихідної папки - це блог).

  1. cd / go / src / blog ... (cd всередині папки, у якій є ваш пакет)
  2. перейти до встановлення
  3. блог

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


0

go run .запустить усі ваші файли. Точка входу - це функція, main()яка повинна бути унікальною дляmain пакета.

Ще один варіант - створити бінарний за допомогою go buildта запустити його.


0

Просто використовуйте команду go run *.goдля виконання всіх файлів go у вашому пакеті!


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