Lekce 1.1

Balíčky, moduly a funkce main

Když poprvé začnete učit Go, syntaxe může vypadat jednoduše — ale pod povrchem se nachází několik extrémně důležitých pravidel, která musí každý Go program dodržovat.

Co se naučíte
  • Jak Go organizuje kód pomocí balíčků (packages)
  • Proč je balíček main speciální a jak funguje
  • Co je to funkce main a proč je nezbytná
  • Jak fungují import statements a standardní knihovna
  • Co jsou Go moduly a jak se používají
  • Jak vytvořit spustitelný soubor pomocí go build

Tři klíčové části každého Go programu

Podívejme se na jednoduchý Go soubor:

go
package main

import "fmt"

func main() {
    fmt.Print("Hello world")
}

Tento program již obsahuje základní komponenty každého platného Go programu:

Package deklarace

Definuje, do kterého balíčku soubor patří

Import statements

Přináší externí funkcionalitu (volitelné)

main funkce

Vstupní bod programu

1. Packages — Jak Go organizuje kód

Na začátku každého Go souboru musíte deklarovat balíček:

go
package main

Pokud tento řádek odstraníte, Go vyhodí chybu:

Expected package clause but found 'import'...

Co je balíček?

Balíček je jednoduše způsob, jak seskupit související Go soubory dohromady.

  • Každý Go soubor patří právě jednomu balíčku
  • Balíček může zahrnovat více souborů
  • Příklady: fmt, http, users, main

Proč main?

Protože main je speciální balíček.

Když je Go program zkompilován do spustitelného souboru, Go potřebuje vědět: "Kde program začíná?"

Pokud je váš balíček pojmenován main, Go s ním zachází jako se vstupním bodem. Pokud není pojmenován main, Go nevytvoří spustitelný soubor.

go
// Pokud změníte na:
package app

// A spustíte:
go build

// → Žádný spustitelný výstup, protože Go nenašel vstupní bod

2. Import Statement — Přinášení externí funkcionality

Řádek:

go
import "fmt"

přináší vestavěný balíček fmt (format) z Go.

Standardní knihovna Go je obrovská a fmt poskytuje tiskovací funkce jako Print, Println a Printf.

Když napíšete:

go
fmt.Print("Hello")

voláte funkci z balíčku fmt. Hodnota "Hello" je stringový literál, vždy uzavřený v dvojitých uvozovkách (jednoduché uvozovky nejsou pro stringy v Go povoleny).

Standardní knihovna Go

Go obsahuje rozsáhlou standardní knihovnu s balíčky pro vše od HTTP serverů po práci se soubory, JSON, kryptografii a mnoho dalšího — vše zabudované.

3. Funkce main — Vstupní bod programu

Uvnitř balíčku main Go očekává právě jednu funkci s názvem main:

go
func main() {
    fmt.Print("Hello world")
}

Toto je první kód, který se provede při spuštění programu.

Důležitá pravidla funkce main:
  • 1.Musí existovat jedna a pouze jedna funkce main na balíček
  • 2.Nemůže přijímat argumenty a nemůže vracet hodnotu
  • 3.Go neprovádí kód, který se nachází na nejvyšší úrovni (mimo funkce), na rozdíl od jazyků jako JavaScript

Klíčové poznání

Funkce main je efektivně startovacím bodem vašeho programu. Bez ní Go neví, kde začít vykonávání.

4. Go Moduly — Identita vašeho projektu

Když spustíte:

go
go build

v úplně nové složce, můžete dostat tuto chybu:

go: cannot find main module...

To proto, že Go vyžaduje, aby byl váš projekt součástí modulu.

Modul je jednoduše Go projekt s identitou.

Vytvoříte ho pomocí:

go
go mod init go-youtube

Toto vygeneruje soubor go.mod:

go
module go-youtube

go 1.23.5

Od této chvíle Go rozpozná složku jako modul a go build bude fungovat.

Best practice pro pojmenování Go modulů

Doporučeno: Použijte plně kvalifikovanou cestu importu

Ekosystém Go očekává, že názvy modulů vypadají takto:

go
go mod init github.com/username/repo
go mod init gitlab.com/username/repo
go mod init example.com/project-name

To proto, že název vašeho modulu slouží jako jeho cesta importu, pokud jej chtějí ostatní (nebo budoucí vy) použít jako závislost.

⚠️ Neidiomatic: Krátké lokální názvy

Vyhněte se takovým názvům:

go
go mod init go-youtube
go mod init myapp
go mod init test

Proč to není ideální:

  • Pokud později importujete vlastní modul, cesty vypadají divně: import "go-youtube/utils"
  • Pokud později přesunete repo na GitHub, zlomíte všechny importy
  • Neříká to Go (nebo ostatním vývojářům), kde modul žije

Příklad best practice

go
go mod init github.com/go-backend-journey/go-youtube

I když to nikdy nepublikujete na GitHub, je to stále naprosto platné. Go moduly nevyžadují, aby repo existovalo — je to pouze namespace.

5. Vytvoření samostatného spustitelného souboru

Jakmile váš modul existuje, můžete sestavit svůj program:

go
go build

Toto vytvoří spustitelný soubor:

  • Na Windows → go-youtube.exe
  • Na Mac/Linux → go-youtube

Dvakrát klikněte nebo spusťte:

go
./go-youtube

Výstup se objeví — dokonce i na počítačích bez nainstalovaného Go.

Síla Go

Toto je jedna z nejsilnějších vlastností Go: vytváříte skutečné, nativní spustitelné soubory. Žádný runtime, žádné závislosti — jen jediný binární soubor, který můžete spustit kdekoliv.

Shrnutí

Klíčové poznatky
  • Packages: Každý Go soubor patří k balíčku. Balíček main je speciální — vytváří spustitelný program.
  • Imports: Přinášejí funkcionalitu z ostatních balíčků. Standardní knihovna Go obsahuje vše od fmt po http.
  • Funkce main: Vstupní bod vašeho programu. Musí být v balíčku main, nemůže přijímat parametry ani vracet hodnoty.
  • Moduly: Definují identitu vašeho projektu. Vytvořte je pomocí go mod init s plně kvalifikovanou cestou.
  • Build: go build vytváří nativní spustitelné soubory, které fungují bez Go runtime.

Praktické cvičení

Výzva: Vytvořte svůj první Go program

Prakticky si procvičte vše, co jste se naučili:

  1. Vytvořte novou složku pro váš projekt
  2. Inicializujte Go modul s vhodným názvem (např. github.com/your-name/hello-go)
  3. Vytvořte soubor main.go s balíčkem main a funkcí main
  4. Naimportujte balíček fmt
  5. Vypište zprávu, která obsahuje vaše jméno a proč se učíte Go
  6. Sestavte program pomocí go build
  7. Spusťte vytvořený spustitelný soubor

Bonus úkol:

Zkuste změnit package main na package app a spusťte go build. Co se stane? Proč?