Go Vscode - отсутствие пакета в std

Linux Mint/VsCode/Go

Всем привет. Это мой первый пост)

Изучаю Go по книге, дошел по Пакетов. Никак не могу решить простейшую задачу с импортом внутри пакета. Точнее не так, я решил одну проблему, но меня стала волновать другая проблема. Сразу напишу, что уже два дня ищу схожую проблему по форумам, есть приблеженные примеры, но моего случая не нашел. Многие ссылаются на читку go.dev туториала, почитал, но целой картины в голове пока что не появилось. Поэтому решил обратиться к комъюнити.

Прошу обратить внимание, в go.mod указана версия 1.24, так и есть, я обновлялся недавно, но в дереве папок указана версия go_1.23.5 - Это правильно или нет? Если нет, то как это решить?

Сначала выложу общую картину: Это простейший код на вывод "Hello" введите сюда описание изображения

Как видно команда в терминале go run main.go выводит нужный результат. Но если честно, я с этим боролся два дня. Понял что файл main.go необходимо запускать находясь внутри пакета hi, и еще некоторые источники предлагали изменить import "greet" на import "src/greet".

Но если идти по учебнику, import "greet", то терминал выдает ошибку:

oem@gibbon:~/go/src/hi$ go run main.go
main.go:3:8: package greet is not in std (/usr/local/go/src/greet)

Пытался понять в чем причина, но так и не понял)) Если кто сможет объяснить "на пальцах", буду благодарен.

Хорошо. Тут я якобы добился своего - терминал выдал нужный результат. Но тут не решается другая проблема. При попытке запуска кода через кнопку Run Code выдает ошибку:

[Running] go run "/home/oem/go/src/hi/main.go"
src/hi/main.go:3:8: package src/greet is not in std (/usr/local/go/src/src/greet)

У меня уже голова не варит почему так. Вроде сама ошибка указывает на проблему, но что с ней делать не знаю. На данный момент есть догадка, которую прочитал на одном из форумов и в нее я верю, хотя возможно ошибочно), но как решить ее не знаю. Там говорится что якобы Vscode запускает код из корневого каталога, а когда через терминал, то там через домашнюю папку. Так это или нет не знаю.

И еще второй момент Подскажите, правильно ли я запустил go.mod, изнутри папки src?

Спасибо за любые ответы.


Ответы (1 шт):

Автор решения: Pak Uula

Импортировать пакет можно только по полному имени. Полное имя получается так: имя_модуля/родительские_пакеты/имя_пакета (кроме пакетов main).

Ваш модуль называется src, каталог с файлами пакета greet лежит в том же каталоге, где go.mod, поэтому полное имя при импорте должно быть

import "src/greet"

Запускать можно файл, а можно пакет main. У вас пакет main находится в каталоге ./hi, поэтому можно запустить как go run ./hi. Для этого нужно быть в каталоге, где находится go.mod

Можно также запустить по полному имени: go run src/hi

Эта команда более универсальна. Её можно запускать как в каталоге, где находится go.mod, так и в любом дочернем каталоге. Например,

cd greet
go run src/hi 

Теперь почему ругается на import "greet". В имени greet нет знака /. Это особенные имена пакетов. Для них модулем служит модуль стандартной библиотеки std. В стандартной библиотеке нет пакета greet, о чем вам сообщает компилятор.

→ Ссылка