Съдържание на курса
Урок 1 — Инсталиране на Go на твоя Linux Mint и първата ти програма
От Dorian Chávez · основател на Hábil и архитект на интеграции ·
Продължителност: 45–60 минути (или 2 сесии по 30). Това е единственият урок, който не преподава Go като език: преподава инструмента и терена, на който ще работиш — а този терен крие повече капани, отколкото изглежда на пръв поглед.
Като приключиш, ще можеш:
- Да инсталираш официалната и актуална версия на Go на Linux Mint, без да зависиш от системния пакет, и да обясниш защо този пакет е остарял по замисъл, а не по небрежност.
- Да обясниш какво са
GOROOT,GOPATHиPATHи защо Go не работи, докато не пипнеш второто. - Да разпознаваш разликата между терминал, който чете твоята конфигурация, и такъв, който не я чете — истинската причина за „добавих го, а пак не работи“ — и да знаеш кой е твоят.
- Да създадеш проект с
go mod init, да напишеш програма и да я изпълниш сgo run. - Да създадеш двоичен файл (binary) с
go buildи да обясниш, с истинска проба, защо той работи на друга машина, без там да има инсталиран Go. - Да използваш
go fmt, за да не спориш никога повече за стила на кода. - Да разпознаваш, дума по дума, най-честите съобщения за грешки на този етап — от компилатора, за права и за път — и да знаеш какво да правиш с всяко от тях.
Защо е важно
Първото, което един стар туториал ще ти предложи, е apt install golang, и това е грешка. Не е дребна
грешка от типа „малко по-стара версия“: това е онзи вид грешка, заради която губиш цял следобед, без да
разбираш защо, седмици след инсталирането, защото симптомът не се появява при инсталирането — появява се,
когато вече програмираш и нещо, което „би трябвало да работи“, не работи.
Това не е мнение, а измерване. На 30 септ. 2026 г. измерих, в контейнер със същата основа като Linux Mint 22.3 (Ubuntu 24.04 „Noble Numbat“, откъдето Mint взема пакетите си):
$ cat /etc/os-release | grep VERSION
VERSION="24.04.5 LTS (Noble Numbat)"
$ apt-cache policy golang-go
golang-go:
Installed: (none)
Candidate: 2:1.22~2build1
Version table:
2:1.22~2build1 500
500 http://ports.ubuntu.com/ubuntu-ports noble/main arm64 Packages
$ curl -s 'https://go.dev/VERSION?m=text'
go1.27.1
Системният пакет предлага 1.22. Официалната актуална версия, измерена в същия момент, е 1.27.1. И това не е небрежност, която някой ще поправи: това е политиката на Ubuntu и на Mint.
Защо се замразява така, нарочно? Ubuntu 24.04 е LTS версия (Long Term Support): в деня, в който излезе, основните ѝ пакети се замразяват и получават само поправки за сигурност, никога нови версии на програмата. Това е правилно решение за сървър, който не бива да променя поведението си само защото са инсталирани обновления — но означава, че компилаторът на език, който пуска нови версии два пъти годишно, остава фиксиран на онази, която е съществувала, когато Ubuntu 24.04 е публикувана (април 2024 г.), завинаги, докато тази версия на Ubuntu съществува. Linux Mint няма собствени пакети за Go: буквално наследява тези на Ubuntu, така че наследява и замразяването.
Защо това е важно конкретно за теб? Защото ще търсиш неща в интернет, примерите ще използват функции или поведения, които твоят Go 1.22 няма, а грешките няма да казват „липсва ти версия“: ще казват неща, които нямат смисъл спрямо онова, което виждаш на екрана. Това е видът проблем, който изглежда като твоя грешка, а всъщност е разминаване в инструмента — и ти се случва преди да си написал първия ред код, затова този урок стои преди всички останали.
🔑 Правилният начин, и той е този, който препоръчва самият проект Go: да изтеглиш официалния пакет
директно от go.dev, а не от пакетния мениджър на твоята дистрибуция. Точно това инсталира този
урок, стъпка по стъпка, и точно това ще проверяваме на всяка стъпка с реалния изход на командите.
Понятията
1.1 Какво са GOROOT и GOPATH и защо преди бяха по-важни от сега
Преди да инсталираш, си струва да знаеш какво ще имаш после, защото имената GOROOT и GOPATH
се появяват в почти всяка грешка при инсталиране, която потърсиш в интернет, а много отговори са
писани за версия на Go отпреди десет години.
GOROOTе папката, в която живее самият Go: компилаторът,gofmt, стандартната библиотека. Това е папката, която ще създадеш в стъпка 1.4 (/usr/local/go). Никога не я пипаш на ръка.GOPATHе папката, в която Go пази твои неща: пакети, изтеглени от интернет, и — в стари версии на Go, преди 2019 г. — и мястото, където трябваше да слагаш целия си код, без изключение, в рамките на фиксирана структура ($GOPATH/src/github.com/tu-usuario/tu-proyecto). Ако някога видиш туториал, който те кара да създадеш тази структура от папки, той е от онази епоха.
Днес почти не я пипаш, защото от Go 1.11 (2018) съществуват модулите (go.mod, който ще създадеш в
стъпка 1.6): проектът ти може да живее във всяка папка, с което име искаш, и Go вече няма нужда
да следваш наложена структура от папки. GOPATH все още съществува, но сега само като кеш за
изтеглени пакети, а не като единственото място, където може да живее кодът ти.
Провери го с go env, която ти показва актуалната конфигурация на инсталацията ти (това можеш да
пуснеш след инсталирането, в стъпка 1.5):
go env GOROOT GOPATH GOBIN
При чиста, току-що направена инсталация ще видиш нещо такова:
/usr/local/go
/home/tu-usuario/go
/home/tu-usuario/go/bin
Нито една от тези три папки не си създал на ръка: първата я създава стъпката на инсталиране (1.4), другите две ги решава сам Go, със смислени стойности по подразбиране.
1.2 PATH: какво е и защо „вече е инсталирано“ не означава „вече работи“
Когато напишеш команда в терминала, например go, терминалът не знае по магия къде е
тази програма: той преглежда, една по една, списък от папки, записан в променлива, наречена PATH, и използва
първата програма с това име, която намери. Ако никоя папка от списъка няма програма, наречена
go, отговаря с грешка — и тази грешка е буквална, а не приблизителна:
$ go version
bash: go: command not found
Проверих това в контейнер, в който Go беше вече разархивиран в /usr/local/go, преди да пипна PATH:
програмата съществува на диска, но терминалът не я намира, защото не знае къде да търси. „Инсталирано“
и „в PATH“ са две различни неща и объркването между тях е източникът на почти всички
спъвания в този урок.
Това обяснява и защо съобщението се променя малко според терминала (zsh вместо bash, което
ще видиш, ако следваш курса на macOS, докато се упражняваш, или ако си сменил терминала по подразбиране на своя
Mint):
$ go version
zsh: command not found: go
Същият проблем, същият механизъм, различен словоред: определи кой е твоят случай с
echo $SHELL, преди да търсиш грешката в интернет, защото търсенето на грешното съобщение ще те отведе до
отговори за грешния shell.
1.3 Разбери коя е последната версия
Не я копирай оттук: този документ остарява точно както хранилищата на Mint, а в предишния раздел вече видя колко може да натежи на един инструмент това да остане фиксиран във времето.
curl -s 'https://go.dev/VERSION?m=text' | head -1
Ще ти отговори нещо като go1.27.1. Това е версията, която ще инсталираш, каквато и да е тя, когато го направиш.
1.4 Изтегли я и я инсталирай
Замени go1.27.1 с това, което ти каза предишната команда. linux-amd64 е правилното за обикновен компютър или
лаптоп (ако машината ти беше ARM, щеше да е linux-arm64; за да разбереш: dpkg --print-architecture).
cd /tmp
wget https://go.dev/dl/go1.27.1.linux-amd64.tar.gz
А сега инсталацията:
sudo rm -rf /usr/local/go # borra una instalación anterior, si había
sudo tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
Какво току-що направи, защото е добре да го разбереш, а не само да го копираш:
tarразархивира файла.-C /usr/localму казва „направи го в тази папка“.-xzfозначава „извлечи“ (x), „компресиран е с gzip“ (z), „от този файл“ (f).- Резултатът е папка
/usr/local/goс целия Go вътре —GOROOTот раздел 1.1.
Защо sudo, след като досега никога не ти е трябвало, за да инсталираш нещо с пакетен мениджър? Защото
/usr/local е системна папка, а не папка на твоя потребител, и в Linux писането там изисква права на
администратор. Без sudo ето какво точно ще видиш — предизвиках го нарочно, без sudo, за
да видиш истинското съобщение, а не измислено:
$ tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
tar: go: Cannot mkdir: Permission denied
tar: go/VERSION: Cannot open: No such file or directory
tar: go/api: Cannot mkdir: No such file or directory
tar: go/api/README: Cannot open: No such file or directory
... (se repite, una vez por cada archivo del paquete)
Това не е една грешка, а стотици. tar се опитва да запише всеки файл от пакета, един по един, и всеки
се проваля по същия начин, защото никой няма право да пише в /usr/local. Ако видиш тази стена от
повтарящи се редове, причината е винаги една и съща и винаги се оправя по един и същ начин: сложи sudo отпред.
1.5 Кажи на системата си къде е — и капанът на съвременните терминали
Сега Go съществува в /usr/local/go/bin/go, но както видя в раздел 1.2, ако напишеш go, ще ти
каже command not found: тази папка все още не е в PATH.
Инструкцията, която ще видиш в почти всеки туториал, включително в официалната документация на Go, е тази:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile
~/.profileе файл, който на теория системата ти чете всеки път, когато влезеш в сесия.source ~/.profileприлага промяната в този терминал, точно сега, без да чакаш следващата сесия.
И тук идва онова, което повечето туториали не ти казват и което проверих с истинска проба: нов терминал не винаги е „нова сесия“.
~/.profile се чете само от онова, което Linux нарича login shell (обвивка при вход) — този, който се стартира, когато влезеш
в системата (например когато включиш машината и влезеш с потребителското си име и парола). Но
повечето терминални приложения (включително терминалът на Mint в настройките му по подразбиране)
при отваряне на нов прозорец или раздел не стартират login shell: стартират обикновен интерактивен
shell, а той чете друг файл, ~/.bashrc, не ~/.profile.
Проверих го така, симулирайки точно този сценарий — „вече редактирах файла, затварям терминала, отварям друг“ — в току-що инсталиран контейнер:
# después de agregar el export SOLO a ~/.profile, en una terminal nueva:
$ go version
bash: go: command not found ← sigue sin funcionar
# después de agregar la MISMA línea también a ~/.bashrc, en una terminal nueva:
$ go version
go version go1.27.1 linux/arm64 ← ahora sí
Инструкцията „затвори терминала, отвори друг“ не винаги е достатъчна, а когато не е, изглежда, че си направил нещо погрешно, когато всъщност си следвал туториала буква по буква. Затова препоръката на този урок, по-надеждна от тази на повечето ръководства, е да добавиш реда и в двата файла:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
~/.profile покрива случая на истинска сесия при вход (например ако използваш SSH или сменяш
потребител); ~/.bashrc покрива много по-честия в ежедневието случай, когато отваряш нов прозорец или раздел на
терминала в сесия, която вече е била отворена.
💡 Ако използваш zsh вместо bash (знаеш го, ако терминалът ти изглежда различно или ако са ти го сменили),
файлът, еквивалентен на .bashrc, е ~/.zshrc. За да разбереш кой shell използваш: echo $SHELL.
🔑 Как да разбереш дали терминалът ти отваря login shell, без да гадаеш: изпълни echo $0 в току-що
отворен терминал. Ако отговорът започва с тире (-bash, -zsh), това е login shell и той чете
~/.profile. Ако няма тире (bash, zsh), не е и ти трябва промяната в ~/.bashrc (или
~/.zshrc), за да се запази.
1.6 Провери, че е проработило
go version
Трябва да отговори нещо като go version go1.27.1 linux/amd64 (или linux/arm64, ако машината ти е ARM). Ако
продължава да казва command not found, провери с echo $0 какъв вид shell е и в кой файл
си сложил промяната, като следваш раздел 1.5.
1.7 Първата ти програма
mkdir -p ~/w/curso-go/hola && cd ~/w/curso-go/hola
go mod init hola
go mod init създава файл go.mod. Това е личната карта на проекта: казва как се казва и коя
версия на Go използва. Това е механизмът на модулите, който вече споменахме в раздел 1.1, и е същият, с
който ще стартираш проекта revisor (проверител) в урок 5.
Създай main.go с това съдържание:
package main
import "fmt"
func main() {
fmt.Println("hola, ya tengo Go")
}
Ред по ред, защото всеки има своята причина:
package main |
„този файл принадлежи на пакета main“. Пакетът main е специален: той е единственият, който създава изпълнима програма. Без този ред щеше да имаш библиотека, а не програма |
import "fmt" |
„ще използвам неща от пакета fmt“ (от format), който носи необходимото за отпечатване. Go не зарежда нищо по подразбиране: каквото използваш, го поискваш |
func main() |
функцията, от която започва програмата ти. Когато я изпълниш, Go търси точно тази функция. Ако се казва другояче, програмата не се стартира |
fmt.Println(...) |
отпечатва и минава на нов ред. Точката означава „функцията Println, която е вътре в fmt“ |
Пусни я:
$ go run main.go
hola, ya tengo Go
Този изход е истински: пуснах я, преди да напиша този ред.
1.8 Командите, които ще използваш винаги — и тънкостта на go.mod
go run main.go # compila y ejecuta de una vez, sin dejar archivo. Para probar mientras trabajas
go build # crea el programa ejecutable y lo deja ahí
go fmt ./... # ordena tu código
go test ./... # corre las pruebas (lección 5)
Една истинска тънкост, която си струва да пробваш сам, защото се промени между версиите на Go: с
програма от един файл като горната go run main.go работи дори без go.mod. Проверих го
в нова папка, без go mod init:
$ go run main.go
hola, ya tengo Go
Но go build в същата папка без go.mod изисква модула:
$ go build
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
Защо е разликата? go run върху един файл може да реши всичко, без да има нужда да знае
името на модула, защото няма нищо, което друг файл да импортира от него. Щом програмата ти
има нужда от повече от един файл — например ако се опиташ да импортираш собствен пакет, както ще направиш в
урок 5 с revisor — Go има нужда от go.mod, за да знае как се казва модулът ти и така да разреши
тези импорти. Проверих и това:
$ go run main.go # main.go importa "hola/utilidades", sin go.mod
main.go:4:5: package hola/utilidades is not in std (/usr/local/go/src/hola/utilidades)
Практическият урок: винаги изпълнявай go mod init, още от първия файл, макар че go run понякога
работи и без него — спестяваш си точно тази грешка в момента, в който програмата ти трябва да импортира собствен пакет,
а това ще стане още в урок 5.
Пробвай разликата между run и build:
$ go build
$ ls -la
-rwxr-xr-x 1 tu-usuario tu-usuario 2341973 ... hola
$ ./hola
hola, ya tengo Go
1.9 Защо двоичният файл е преносим: статично свързване
🔑 Файлът hola, който създаде go build, е пълна и самодостатъчна програма. И това не
трябва да се приема на вяра: проверих го, като копирах точно този двоичен файл, компилиран на машина с инсталиран Go, в
чист контейнер, без Go:
$ which go
go no esta instalado
$ ./hola
hola, ya tengo Go
Проработи. Не му трябва интерпретатор, нито виртуална машина, нито външни библиотеки, инсталирани отделно,
защото Go прави статично свързване (static linking): вместо да казва „когато се изпълняваш, потърси библиотеката fmt някъде
в системата“ (както работят много програми на C или Python), Go копира в самия
двоичен файл всичко, от което програмата ти има нужда, за да работи. Затова файлът тежи повече — малко над 2 MB за
програма от един ред — но в замяна можеш да го копираш на всяка съвместима Linux машина и той ще
работи както си е, без да инсталираш нищо друго.
Това е най-практичната характеристика на Go и затова толкова много сървърни инструменти са написани
на него — включително revisor, който ще компилираш и публикуваш в урок 7.
1.10 Редактор, който да ти помага
Не е задължително, но ще ти спести много време. Ако използваш VS Code, инсталирай официалното разширение
Go (от golang.go). Измерено на 30 септ. 2026 г. в Marketplace на Visual Studio: публикуваната версия
е 0.57.2. И това число ще остарее — важното е да инсталираш онази, която предлага
Marketplace в деня, в който го правиш, а не да запишеш това число.
Разширението ще ти подчертава грешките, докато пишеш, вместо да разбереш за тях при компилиране, и ти
позволява да скочиш до дефиницията на всяко нещо с F12. Първия път ще те помоли да инсталираш няколко
допълнителни инструмента (gopls, езиковия сървър на Go, и други): кажи „да“ на всички.
Грешката, която ще видиш
Всички тези съобщения са истински, предизвикани нарочно за този урок — а не приблизителни описания на това, което „вероятно“ биха казали:
| Симптомът | Буквално съобщение | Какво става и какво да направиш |
|---|---|---|
Терминал bash без Go в PATH |
bash: go: command not found |
Програмата не е в никоя папка от PATH. Прегледай раздел 1.5 |
Терминал zsh без Go в PATH |
zsh: command not found: go |
Същият проблем, различен словоред, защото е друг shell |
tar без sudo към /usr/local |
tar: go: Cannot mkdir: Permission denied (повтаря се за всеки файл) |
Липсва sudo преди командата за разархивиране (раздел 1.4) |
Добавил си PATH само в ~/.profile и си отворил нов терминал |
bash: go: command not found (продължава) |
Терминалът ти не отваря login shell; добави реда и в ~/.bashrc (раздел 1.5) |
go build в папка без go.mod |
go: go.mod file not found in current directory or any parent directory; see 'go help modules' |
Изпълни go mod init <nombre> в тази папка |
Импорт на собствен пакет без go.mod |
main.go:4:5: package hola/utilidades is not in std (...) |
Същото като предишното: без модул Go не знае как да разреши собствените ти пакети |
Забравил си import "fmt" и си използвал fmt.Println |
# command-line-arguments<br>./main.go:4:2: undefined: fmt |
Go познава всички налични символи; ако не си импортирал пакета, той не съществува за него |
go version отговаря 1.22 вместо актуалната |
(без грешка, но грешна версия) | Използва се този от apt. Премахни го със sudo apt remove golang-go и потвърди, че /usr/local/go/bin е в PATH |
И общото правило, което важи и за осемте: копирай цялото съобщение за грешка и го потърси както си е, без да го преразказваш първо със свои думи. Почти винаги някой вече го е имал, а съобщението почти винаги казва точно какво липсва — да гадаеш, без да си го прочел изцяло, е най-бавният начин да го решиш.
Какво се прави погрешно
Инсталиране на Go с пакетния мениджър на системата (
apt install golang). Това е най- честото предложение в старите туториали и е точно проблемът от раздела „Защо е важно“: замразена LTS версия те оставя години назад, без да те предупреди с каквато и да е грешка, а само със странни поведения по- късно.Да приемеш за даденост, че „затвори и отвори терминала“ винаги презарежда конфигурацията. Това е капанът, измерен в раздел 1.5: ако терминалът ти не отваря login shell, затварянето и повторното му отваряне не прочита отново
~/.profile. Симптомът — „направих го както трябва, а не работи“ — не означава, че си сбъркал, а че този файл не е бил онзи, който терминалът ти чете.Разархивиране на новата версия върху стара инсталация, без първо да я изтриеш.
sudo rm -rf /usr/local/goот стъпка 1.4 не е за украса: ако разархивираш върху стара инсталация, остават смесени файлове от двете и резултатът е Go, който се проваля по неразбираеми начини. Първо изтрий, винаги.Да разчиташ, че
go runработи безgo.mod, и затова да пропуснешgo mod init. Вярно е за самостоятелен файл (раздел 1.8), но престава да е вярно, щом програмата ти има повече от един файл — а дотогава вече ще си написал код, който ще трябва да реорганизираш. Изпълнявайgo mod initот самото начало, винаги.Да спориш за стила на кода на ръка. В Go за стила не се спори: решава го инструментът. Пробвай да напишеш това нарочно, цялото изкривено:
package main import "fmt" func main(){ fmt.Println( "hola" ) }Изпълни
go fmt ./...и отвори файла отново: подредил се е сам. Няма спорове за това къде отива скобата или колко интервала има отстъпът, защотоgofmtима един-единствен отговор и всички го използват. Свикни да го пускаш, преди да запазиш, вместо да форматираш на ръка.
Упражнения
- Инсталирай Go, като следваш раздели от 1.3 до 1.6, и потвърди версията с
go version. - Изпълни
echo $0в терминала си преди да пипнеш PATH. Според отговора реши дали трябва да промениш~/.profile,~/.bashrcили и двата (раздел 1.5) — и обясни защо, със свои думи, преди да продължиш. - Създай проекта
holaот раздел 1.7, изпълниgo run main.go, а след товаgo build+./hola. - (Както в раздел 1.9) Копирай двоичния си файл
holaна друга Linux машина или на виртуална машина / контейнер без инсталиран Go и потвърди, че работи по същия начин. - Смени съобщението на
fmt.Printlnс нещо свое, разбъркай нарочно отстъпа и изпълниgo fmt ./.... Провери, че файлът е форматиран правилно. - (Малко по-трудно) Създай нова папка, без
go mod init, сmain.goот един-единствен файл. Потвърди, чеgo run main.goвсе пак работи. След това изпълниgo buildв същата папка и сравни грешката с тази от раздел 1.8. Обясни със свои думи защо едното работи, а другото — не. - (Малко по-трудно) Изтрий нарочно реда
import "fmt"и изпълниgo run main.go. Прочети цялата грешка, без още да я търсиш, и се опитай да обясниш със свои думи какво ти казва, преди да продължиш.
Решения
go versionтрябва да отпечата същата версия, която видя вcurl -s 'https://go.dev/VERSION?m=text', никогаgo1.22.x(това е версията отaptна Mint).Ако
echo $0отговори с тире в началото (-bash), терминалът ти отваря login shell-ове и~/.profileе достатъчен. Ако отговори без тире (bash), това не е login shell и само~/.bashrc(или~/.zshrcв zsh) ще се запазва между новите прозорци — добави промяната и там, както в раздел 1.5.go run main.goотпечатваhola, ya tengo Go. Следgo buildв папката се появява файлhola;./holaго изпълнява директно, без да компилира отново.Двоичният файл работи по същия начин на машината без Go, защото Go прави статично свързване (раздел 1.9): всичко, от което програмата има нужда, вече е копирано в самия файл.
Преди
go fmtфайлът изглежда точно както е написан (изкривен). След товаgofmtго пренарежда със стандартния отстъп и интервали на Go — без ти да решаваш каквото и да е от това.go run main.goработи, защото с един-единствен файл Go няма нужда да разрешава собствени импорти, за да го компилира и изпълни наведнъж.go build, от друга страна, изисква да знае името на модула от първия момент и отговаряgo: go.mod file not found.... Разликата е, чеbuildоставя двоичния файл готов за използване извън това конкретно извикване, а за това му трябва идентичност на проект — наrunне му трябва.Компилаторът отговаря:
# command-line-arguments ./main.go:4:5: undefined: fmtКазва, че си използвал
fmt.Println, без да си импортирал пакетаfmt: компилаторът познава всички символи, които можеш да използваш, и ако не си го импортирал, той не съществува за него. Оправя се, като върнеш редаimport "fmt".
Как разбирам, че съм успял
-
go versionотговаря с версията, която видях вgo.dev/VERSION, а не с 1.22. - Знам дали терминалът ми отваря login shell-ове или не (
echo $0) и в кой файл (или файлове) сложих промяната на PATH съответно. -
go run main.goотпечатва моето съобщение. -
go buildсъздаде файл и./holaработи. - Копирах двоичния си файл на друга машина (или контейнер) без Go и той работи по същия начин.
- Пробвах
go fmtвърху зле написан код и той го подреди. - Предизвиках грешката на
go buildбезgo.modи мога да обясня защоgo runне я получи. - Предизвиках грешката с липсващ
importи разбрах съобщението, без да ми трябва решението. - Мога да обясня, без да гледам текста, каква е разликата между
GOROOT,GOPATHиPATH.
Резюме
- Никога не инсталирай Go с пакетния мениджър на системата (
apt install golang): LTS версиите на Linux се замразяват и пакетът остава години назад, без да предупреди с каквато и да е грешка. GOROOTе мястото, където живее Go;GOPATHе мястото, където Go пази изтеглени пакети; нито едното не пипаш на ръка в съвременен проект с модули (go.mod).PATHе списъкът от папки, в които терминалът търси програми. Да имаш инсталиран Go и да имаш Go вPATHса две различни неща.- Нов терминал не винаги е login сесия: повечето четат само
~/.bashrc(или~/.zshrc), а не~/.profile. Добави промяната наPATHи в двата файла. go mod initсъздава идентичността на проекта (go.mod); всеки проект на Go има нужда от нея, макар чеgo runпонякога работи без нея с един-единствен файл.go runкомпилира и изпълнява, без да оставя файл;go buildоставя двоичния файл;go fmtформатира автоматично, без възможност за спор относно стила.- Двоичният файл, който създава
go build, е самодостатъчен благодарение на статичното свързване: работи на друга съвместима Linux машина без инсталиран Go. - Всяко съобщение за грешка в този урок е буквално, предизвикано нарочно:
command not found,Permission denied,go.mod file not found,undefined: fmt— копирай ги както са, когато ги търсиш.
За допълнително четене
- Download and install — официалното ръководство за инсталиране, източникът на
истината, ако нещо в този урок остарее. Съдържа същата препоръка за
~/.profile, която използваме тук, със същото предупреждение, че промяната „може да не се приложи до следващото влизане в сесия“ — което е точно онова, което беше измерено и обяснено подробно в раздел 1.5. - A Tour of Go — официалната интерактивна обиколка; започва точно там, където свършва този урок.
- Effective Go — съдържа раздела за
gofmtи защо за форматирането не се спори в Go. - GNU Bash — Manual: Bash Startup Files —
официалният справочник за това кога се чете
~/.profileи кога~/.bashrc; струва си да го прочетеш целия веднъж в живота, защото объркването между двата не е присъщо само на Go.
Термини от този урок
| Термин | Какво означава |
|---|---|
GOROOT |
папката, в която живее инсталацията на Go: компилаторът, gofmt, стандартната библиотека |
GOPATH |
папката, в която Go пази изтеглени пакети; преди модулите там трябваше да живее и целият ти код |
PATH |
списъкът от папки, в които терминалът търси изпълними програми |
| login shell | терминалната сесия, която се стартира при влизане в системата; тя е единствената, която чете ~/.profile |
go.mod |
файлът, който идентифицира проект на Go: неговото име и версията на Go, която използва |
| двоичен файл (binary) | изпълнимият файл, който създава go build, самодостатъчен, без да зависи от това дали има инсталиран Go |
| статично свързване | техниката, при която Go копира в двоичния файл всичко, от което програмата има нужда, вместо да го търси в системата при изпълнение |
gofmt |
инструментът, който форматира автоматично кода на Go, без опции за спорове |
Предпочитате имейл? Пишете ни на hola@habil.mx