README.md
Ši pamoka yra projekto dalis
Programavimo mokymosi platforma
Pamatyk galutinį rezultatą
Prieš pradedant — pažiūrėk, ką pastatysi. Veikianti aplikacija jau gyvena internete.
apps.programuoki.lt/go-full-stack
Peržiūrėti veikiančią aplikaciją

Projekto struktūra

Sukuriame Go projektą, konfigūruojame modulius ir paleidžiame pirmą serverį.

go.mod failas

go.mod

Kai paleidai go mod init programuoki — Go sukūrė šį failą automatiškai.

module programuoki

go 1.23

require (
    github.com/go-chi/chi/v5 v5.0.10
    github.com/mattn/go-sqlite3 v1.14.17
    github.com/a-h/templ v0.2.543
)
  • module programuoki — modulio pavadinimas
  • go 1.23 — minimali Go versija
  • require — išorinės bibliotekos

Pridėti biblioteką:

go get github.com/some/library

main.go — įėjimo taškas

main.go

Tai jūsų programos pradžios taškas. Go visada pradeda vykdymą nuo main() funkcijos.

package main

import (
    "net/http"
    "github.com/go-chi/chi/v5"
)

func main() {
    r := chi.NewRouter()
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Sveiki!"))
    })
    http.ListenAndServe(":8090", r)
}

Tolesnėse pamokose pridėsime tikrus handlerius.

handlers/home.go

handlers/home.go

Handleriai apdoroja HTTP užklausas.

func HandleHome(queries *internaldb.Queries) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        lang := GetLang(r)
        t := i18n.Get(lang)
        stacks, _ := queries.GetAllStacks(r.Context())
        templates.HomePage(t, lang, stacks).Render(r.Context(), w)
    }
}

Closure pattern — perduodame queries be globalių kintamųjų.

db/schema.sql

db/schema.sql

SQLite schema apibrėžia duomenų struktūrą. Naudojame Goose migracijoms.

CREATE TABLE stacks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    slug TEXT NOT NULL UNIQUE,
    name_lt TEXT NOT NULL,
    name_en TEXT NOT NULL,
    is_published INTEGER NOT NULL DEFAULT 0,
    created_at DATETIME NOT NULL DEFAULT (datetime('now'))
);

Paleisti migracijas:

goose -dir db/migrations sqlite3 programuoki.db up

templates/home.templ

templates/home.templ

Templ generuoja type-safe HTML.

templ HomePage(t i18n.Translations, lang string, stacks []internaldb.Stack) {
    @layouts.Base(t, lang, t.HeroTitle) {
        for _, stack := range stacks {
            <div>{ stack.NameLt }</div>
        }
    }
}

Po pakeitimo paleisk:

templ generate