Пытаясь понять, как найти структуры в моем проекте и пакетах

В моем main.go я пытаюсь ссылаться на структуру, я получаю сообщение об ошибке:

undefined: UserService

/main.go с пакетом main

userService := &UserService{}

/services/user_service.go с основным пакетом

type UserService struct {
  // ..
}

Почему он не может найти мою структуру? Могу ли я поместить файлы / services в другой пакет? Если так, то как бы я сослался на них в моем файле main.go?

1 ответ

Я использую это, используя go run main.go ,

Это проблема. go run main.go будет только строить main.go, Для проекта с несколькими файлами используйте go build, Затем он найдет ваши исходные файлы и соберет их. Но это тоже не сработает, потому что вы не следуете соглашениям Go для разметки исходного кода.

go Инструмент обеспечивает особый способ структурирования вашего проекта. Вы можете прочитать об этом в Как написать код Go. В общем, дерево исходного кода является плоским. go build просто не находит services/user_service.go, Вы можете увидеть это с go build -x,

$ tree
.
├── main.go
└── service
    └── user_service.go

1 directory, 2 files

$ go build -x
WORK=/var/folders/0b/7xp2lxbd7yl0tcpms06fr3d40000gn/T/go-build148902279
mkdir -p $WORK/soq/_obj/
mkdir -p $WORK/soq/_obj/exe/
cd /Users/schwern/go/src/soq
/opt/local/lib/go/pkg/tool/darwin_amd64/compile -o $WORK/soq.a -trimpath $WORK -goversion go1.9.3 -p main -complete -buildid 08f76ca23c0110836288d4a2c698c2692588f909 -D _/Users/schwern/go/src/soq -I $WORK -pack ./main.go
# soq
./main.go:8:21: undefined: UserService

Обратите внимание, что compile работает только на main.go,

Простое решение состоит в том, чтобы сгладить ваше исходное дерево.

$ tree
.
├── main.go
└── user_service.go

0 directories, 2 files

$ go build -x
WORK=/var/folders/0b/7xp2lxbd7yl0tcpms06fr3d40000gn/T/go-build117658131
mkdir -p $WORK/soq/_obj/
mkdir -p $WORK/soq/_obj/exe/
cd /Users/schwern/go/src/soq
/opt/local/lib/go/pkg/tool/darwin_amd64/compile -o $WORK/soq.a -trimpath $WORK -goversion go1.9.3 -p main -complete -buildid 8dfd03a3d0d09267ebc5ff9d1b8dd630d7465e9c -D _/Users/schwern/go/src/soq -I $WORK -pack ./main.go ./user_service.go
cd .
/opt/local/lib/go/pkg/tool/darwin_amd64/link -o $WORK/soq/_obj/exe/a.out -L $WORK -extld=/usr/bin/clang -buildmode=exe -buildid=8dfd03a3d0d09267ebc5ff9d1b8dd630d7465e9c $WORK/soq.a
mv $WORK/soq/_obj/exe/a.out soq

И теперь работает нормально.


Вы можете подумать: "А что, если я захочу делать более сложные вещи? "

Вы можете написать свой собственный инструмент для сборки, который прошел по подкаталогам, чтобы найти все файлы Go и передать их go build, Но это идет вразрез с природой Го, и с течением времени вам придется подрывать все больше и больше инструментов.

Go специально разработан для предотвращения сложности. Большие исходные деревья с подкаталогами стимулируют сложность и допускают запутанные подсистемы, поэтому go инструмент не поможет вам с ними. (Язык Go не заботится о вашей файловой структуре, просто go инструмент для сборки).

Вместо этого, Go способ разобраться с этим - разделить services прочь в новый пакет. Разработайте его с четкими границами и без искушения связать его с другими системами, и import это в ваш основной пакет.

Другие вопросы по тегам