#go #goland
#Вперед #голанд
Вопрос:
Я следую официальному руководству по Go: https://golang.org/doc/code.html
Но вместо того, чтобы что-то делать через командную строку, я использую GoLand. Я могу запустить программу и увидеть напечатанный «Hello World», когда все содержится внутри пакета HelloWorld.go, но когда я добавляю пакет morestrings и пытаюсь импортировать его в HelloWorld.go, я получаю сообщение об ошибке импорта ( Cannot resolve file 'morestrings'
):
package main
import (
"morestrings"
"fmt"
)
func main() {
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
}
Вот как я определил morestrings
пакет:
package morestrings
// ReverseRunes returns its argument string reversed rune-wise left to right.
func ReverseRunes(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i 1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
Я установил GOPATH
в настройках проекта корневой каталог моего проекта ( GoGoHelloWorld
). Насколько я понимаю, Go будет искать импорт, начиная с GOPATH
, поэтому я ожидаю, что он найдет пакет morestrings . Вот структура файла:
Комментарии:
1. Вы должны использовать полный путь. Пример делает то же самое, используя
"example.com/user/hello/morestrings"
2. что произойдет, если вы запустите
go build
?3. @rhughes Я получаю сообщение об ошибке «go: не удается найти основной модуль; см. раздел «Перейти к справочным модулям». Я понимаю это даже с закомментированным импортом, поэтому, должно быть, я что-то сломал во время переделки
4. @Flimzy странно то, что Intellij на самом деле предлагает автозаполнение импорта для меня так же, как «morestrings». Хотя я все еще получаю сообщение об ошибке после выполнения автозаполнения.
5. @rhughes Я воссоздал проект. Теперь я могу создать «hello world», но я все еще не могу импортировать проект. Вот результат сборки:
GOROOT=/usr/local/go #gosetup GOPATH=/Users/.../IdeaProjects/FinalGoHelloWorld #gosetup /usr/local/go/bin/go build -o /private/var/folders/fg/2gwq43b172qcbccjx7_fzlfxsw9zkw/T/___go_build_HelloWorld_go /Users/.../IdeaProjects/FinalGoHelloWorld/HelloWorld.go #gosetup /private/var/folders/fg/2gwq43b172qcbccjx7_fzlfxsw9zkw/T/___go_build_HelloWorld_go #gosetup Hello, world.
процесс завершен с кодом выхода 0
Ответ №1:
Во-первых, я думаю, вы можете взглянуть на этот макет проекта go, который может отличаться от других языков, таких как C или Java. Во-вторых, я хотел бы использовать модуль go.
Комментарии:
1. Я заинтригован, но без дополнительного контекста (т. Е. Как я могу использовать модуль Go с Intellij?), Это лучше как комментарий, а не полный ответ.
2. Это правда, что я хотел написать комментарий, а не ответ, но я получил ограничение, когда нажал кнопку комментария под вашим вопросом. Вы можете пройти пробную версию GoLand, которая также является продуктом JetBrains. Создайте проект и выберите
Go Modules
.3. Несколько дней назад мой коллега запустил проект с
src
каталогом с модулем go, но есть некоторые проблемы, связанные с тем, что только основной пакет, который является исполняемым пакетом, и другой пакет не могут импортировать или импортировать из других частей проекта.
Ответ №2:
Если ваш путь перехода — GOPATH=/Users/…/IdeaProjects/FinalGoHelloWorld . Я предполагаю, что вы создали проект «GoGoHelloWorld» внутри «FinalGoHelloWorld».
Ваш оператор импорта неверен, вам следует использовать «GoGoHelloWorld / src / morestrings»
Ответ №3:
Когда вы пытаетесь импортировать пакет в GO, он не ищет этот пакет повсюду во всей файловой системе, он ищет этот пакет в определенных папках. Эти папки являются src
папкой внутри вашего GOROOT
GOPATH
каталога and .
Весь ваш код должен быть помещен в эту GOPATH
src
папку.
Вы упомянули в разделе комментариев GOPATH=/Users/.../IdeaProjects/FinalGoHelloWorld
. Итак, вы должны создать src
папку внутри этого каталога, и весь код будет помещен внутрь src
.
Таким GoGoHelloWorld
образом, полный путь к вашей папке должен быть /Users/.../IdeaProject/FinalGoHelloWorld/src/GoGoHelloWorld
, так что теперь ваш импорт должен выглядеть больше как
import (
"GoGoHelloWorld/src/morestrings"
"fmt"
)
Для справки, поскольку ваш GOROOT — это GOROOT=/usr/local/go
ваш пакет (папка) fmt, он будет загружен по адресу /usr/local/go/src/fmt
Я бы также рекомендовал изменить имя GOPATH
папки с FinalGoHelloWorld
на что-то более общее, например GoWorkspace
. Таким образом, внутри GoWorkspace/src
вы можете создать несколько папок проектов с определенным именем.
И последнее, создайте еще две папки bin
и pkg
, наряду с src
inside GOPATH