Привет, мир в Голанде

#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