Ответ 1
Попробуйте запустить только go build
. Когда вы даете ему файл go в качестве аргумента, он не будет искать другие файлы go. Вы также можете сделать go build *.go
Моя структура проекта такая.
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
. Возможно ли такое структурирование моего кода?
Попробуйте запустить только go build
. Когда вы даете ему файл go в качестве аргумента, он не будет искать другие файлы go. Вы также можете сделать go build *.go
Это старый пост, но он не ответил на мою проблему четко, поэтому я отправляю на благо других в будущем.
При запуске go run --help
вы найдете это руководство:
Запуск компилирует и запускает основной пакет, содержащий именованные исходные файлы Go. Исходный файл Go определяется как файл, заканчивающийся в буквальном суффиксе ".go".
По умолчанию "go run" запускает скомпилированный двоичный файл напрямую: "аргументы a.out...".
go run <filename.go>
используется для небольших программ с несколькими файлами. С несколькими файлами вы столкнетесь с проблемой, когда ваш main.go
не может найти другие файлы, потому что go run
не компилирует и не связывает их неявно, кроме имени. Вот почему go build
работает проект.
В качестве альтернативы, go run *.go
(создание всех файлов) должно работать большую часть времени.
На веб-странице golang.org вы можете прочитать о команде build
которая:
Если аргументы представляют собой список файлов .go, сборка обрабатывает их как список исходных файлов с указанием одного пакета.
Итак, go build main.go
будет рассматривать main.go как единый пакет. Вместо этого вы должны использовать:
go build
включить все файлы в папку.
Я думаю, проблема в том, что у вас может быть только один файл с использованием основного пакета.
Попробуйте добавить lib.go в другой пакет. Для этого требуется:
lib.go существует в папке с тем же именем, что и новый пакет (например, myLibs).
Добавление имени пакета в lib.go(пакет myLibs).
Затем в основном:
import myLibs
call myLibs.Test()
lib.go
должен быть переименован в main_test.go
func Test(t *testing.T) {
testing
пакета должно быть импортировано в main_test.go
.Test
должна иметь имя, отражающее то, что она тестирует, например TestPrinting
. Тогда и go build
и go test
должен работать.
Вы также можете попробовать команду ниже, если вы не хотите build
а просто выполнить ее:
go run main.go lib.go