Ошибка imported and not used
./main.go:5:2: "os" imported and not usedGo не собирает программу, в которой подключён пакет, но ни одно его имя не используется. Как и с переменными, это ошибка, а не предупреждение. Решение — удалить пакет из import:
package main
import (
"fmt"
)
func main() {
fmt.Println("готово")
}готовоЕсли в скобках остался один пакет, их можно убрать: import "fmt".
Пусть редактор делает это сам
Следить за import вручную не обязательно. Расширение Go для VS Code при сохранении файла само добавляет нужные пакеты и убирает лишние. Если этого не происходит, проверьте, что расширение установлено и включено форматирование при сохранении.
Без редактора то же делает утилита goimports — она устроена как gofmt, но ещё и правит import:
go install golang.org/x/tools/cmd/goimports@latest
goimports -w main.go-w записывает исправления в файл. Сама программа попадёт в $HOME/go/bin — эта папка должна быть в PATH (справка go: command not found).
Обратная ошибка: undefined
Если пакет используется, а import для него нет, сообщение другое:
./main.go:6:2: undefined: stringsДобавьте пакет в import: "strings". Имя в коде — последняя часть пути: для "math/rand/v2" пишут rand.IntN, для "net/http" — http.Get.
Пакет нужен только ради действия при подключении
Некоторые пакеты подключают ради того, что они делают при загрузке, а их имена в коде не нужны. Например, драйвер базы данных регистрирует себя для database/sql. Чтобы Go не считал такой импорт лишним, перед путём пишут _:
import (
"database/sql"
_ "github.com/lib/pq"
)Так import не даёт ошибки, а код инициализации пакета выполняется. Ставить _ просто чтобы заглушить ошибку у обычного пакета не нужно — удалите его.
Пока пишете код
Если пакет скоро понадобится, а собрать программу нужно сейчас, можно временно использовать любое его имя:
var _ = os.ExitНо проще удалить строку import и вернуть её, когда пакет понадобится, — редактор с расширением Go сделает это сам.
Подводные камни
- Два пакета с одним именем.
math/randиcrypto/randоба называютсяrand. Чтобы подключить оба, одному дают другое имя:crand "crypto/rand", и в коде пишутcrand.Read. - Имя пакета не совпадает с концом пути. У некоторых сторонних пакетов имя отличается от последней части пути — смотрите строку
packageв их документации на pkg.go.dev. - Импорт есть, а пакет не найден.
no required module provides package …— пакет не скачан. Выполнитеgo mod tidyв папке модуля.