Подтвердить что ты не робот

Функция в том же пакете undefined

Моя структура проекта такая.

packagetest/
    main.go
    lib.go

В main.go у меня есть этот код.

package main

import "fmt"

func main() {
    fmt.Println("Hello from main.go.")
    Test()
}

В lib.go у меня есть этот код.

package main

import "fmt"

func Test() {
    fmt.Println("This is the Test function in lib.go.")
}

Когда я пытаюсь скомпилировать с go build main.go, я получаю ./main.go:7: undefined: Test. Возможно ли такое структурирование моего кода?

4b9b3361

Ответ 1

Попробуйте запустить только go build. Когда вы даете ему файл go в качестве аргумента, он не будет искать другие файлы go. Вы также можете сделать go build *.go

Ответ 2

Это старый пост, но он не ответил на мою проблему четко, поэтому я отправляю на благо других в будущем.

При запуске go run --help вы найдете это руководство:

Запуск компилирует и запускает основной пакет, содержащий именованные исходные файлы Go. Исходный файл Go определяется как файл, заканчивающийся в буквальном суффиксе ".go".

По умолчанию "go run" запускает скомпилированный двоичный файл напрямую: "аргументы a.out...".

go run <filename.go> используется для небольших программ с несколькими файлами. С несколькими файлами вы столкнетесь с проблемой, когда ваш main.go не может найти другие файлы, потому что go run не компилирует и не связывает их неявно, кроме имени. Вот почему go build работает проект.

В качестве альтернативы, go run *.go (создание всех файлов) должно работать большую часть времени.

Ответ 3

На веб-странице golang.org вы можете прочитать о команде build которая:

Если аргументы представляют собой список файлов .go, сборка обрабатывает их как список исходных файлов с указанием одного пакета.

Итак, go build main.go будет рассматривать main.go как единый пакет. Вместо этого вы должны использовать:

go build

включить все файлы в папку.

Ответ 4

Я думаю, проблема в том, что у вас может быть только один файл с использованием основного пакета.

Попробуйте добавить lib.go в другой пакет. Для этого требуется:

  • lib.go существует в папке с тем же именем, что и новый пакет (например, myLibs).

  • Добавление имени пакета в lib.go(пакет myLibs).

Затем в основном:

import myLibs
call myLibs.Test()

Ответ 5

  • lib.go должен быть переименован в main_test.go
  • Сигнатура функции test должна быть func Test(t *testing.T) {
  • testing пакета должно быть импортировано в main_test.go.
  • В идеале функция Test должна иметь имя, отражающее то, что она тестирует, например TestPrinting.

Тогда и go build и go test должен работать.

Ответ 6

Вы также можете попробовать команду ниже, если вы не хотите build а просто выполнить ее:

go run main.go lib.go