Рейтинг обговорення:
  • 0 Голосів - 0 Середнє
  • 1
  • 2
  • 3
  • 4
  • 5

Як створити та розгорнути сайт на мові Go: від Hello World до деплою
#1

Вступ: Чому Go (Golang) — це чудовий вибір для веб-розробки?

Go, або Golang, розроблений компанією Google, за останні роки став однією з найпопулярніших мов для створення високонавантажених бекенд-систем. Його головні переваги — це неймовірна швидкість виконання (близька до C++), простота синтаксису та вбудована підтримка конкурентності (goroutines). У цьому гайді ми пройдемо шлях від написання першого сервера до його деплою на реальний сервер.

1. Налаштування оточення

Перш за все, вам потрібно встановити Go з офіційного сайту go.dev. Після інсталяції перевірте версію в терміналі:
Код:
go version

Створіть робочу директорію для проекту та ініціалізуйте модуль:
Код:
mkdir my-go-site
cd my-go-site
go mod init github.com/username/my-go-site

2. Створення базового HTTP-сервера

Go має потужну стандартну бібліотеку net/http, яка дозволяє створити сервер без сторонніх фреймворків. Створіть файл main.go:

Код:
package main

import (
    "fmt"
    "net/http"
)

func homeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "<h1>Вітаємо на моєму сайті на Go!</h1>")
}

func main() {
    http.HandleFunc("/", homeHandler)
    fmt.Println("Сервер запущено на http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

Запустіть код командою
Код:
go run main.go
і ви побачите свою першу сторінку в браузері.

3. Робота з шаблонами (HTML Templates)

Для створення реальних сайтів ми використовуємо пакет html/template. Це дозволяє безпечно (із захистом від XSS) вставляти дані в HTML-код.

Приклад створення шаблону templates/index.html:
Код:
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Header}}</h1>
    <p>Сьогодні: {{.Date}}</p>
</body>
</html>

Код у Go для рендерингу:
Код:
func handler(w http.ResponseWriter, r *http.Request) {
    tmpl := template.Must(template.ParseFiles("templates/index.html"))
    data := struct {
        Title  string
        Header string
        Date   string
    }{
        Title:  "Мій Go Сайт",
        Header: "Ласкаво просимо!",
        Date:   time.Now().Format("02.01.2006"),
    }
    tmpl.Execute(w, data)
}

4. Вибір фреймворку: Standard Lib чи Fiber/Echo?

Хоча стандартна бібліотека крута, для великих проектів часто використовують:
- Fiber: Дуже швидкий (подібний до Express.js у Node.js).
- Echo: Мінімалістичний та високопродуктивний.
- Gin: Один із найпопулярніших завдяки своїй стабільності та екосистемі.

Якщо ви тільки починаєте — спробуйте Gin, він має чудову документацію.

5. Робота з базою даних

Для Go найкраще підходить PostgreSQL. Ми можемо використовувати драйвер pgx або ORM на кшталт GORM.

Приклад підключення (GORM):
Код:
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
    panic("failed to connect database")
}

Go дозволяє писати типобезпечні запити, що значно зменшує кількість помилок у рантаймі.

6. Структура проекту

Типова структура професійного Go-проекту виглядає так:
- /cmd: Точки входу (main.go).
- /internal: Бізнес-логіка, прихована від зовнішнього світу.
- /pkg: Бібліотеки, які можна перевикористовувати.
- /api: Визначення API-інтерфейсів.

7. Компіляція та Деплой

Одна з найбільших переваг Go — це компіляція в один бінарний файл. Вам не потрібно встановлювати Go на сервері!

Зберіть проект:
Код:
GOOS=linux GOARCH=amd64 go build -o mysite ./cmd/main.go

Тепер просто скопіюйте файл mysite на свій VPS (наприклад, через scp) і запустіть його.

Використання Docker:
Створіть Dockerfile:
Код:
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

FROM alpine:latest
COPY --from=builder /app/main /main
ENTRYPOINT ["/main"]

Це створить максимально легкий образ (близько 15-20 МБ), який легко розгортати в Kubernetes або через Docker Compose.

Поради для продакшену:
1. Використовуйте Nginx як Reverse Proxy для кешування та SSL.
2. Налаштуйте Systemd юніт, щоб сайт автоматично перезапускався після збоїв.
3. Обов'язково додайте логування (наприклад, пакет uber-go/zap).

Висновок

Go — це мова для тих, хто втомився від складності Java або повільності Python/PHP. Вона дає розробнику повний контроль, неймовірну швидкість та впевненість у тому, що код буде працювати стабільно під будьяким навантаженням.

Чи пробували ви вже писати бекенд на Go? Які були ваші найбільші труднощі? Обговоримо у коментарях!

Wink  Займаюсь розробкою сайтів, SEO просуванням: HTML, CSS, PHP, SEO, ADS, Ardilla-cms
Відповідь
#2

Дякую за статтю! Питання по 5 пункту: а як щодо ORM? Я звикла до Sequelize в Node.js, чи варто в Go використовувати GORM, чи все ж таки краще писати сирі SQL запити? Чула, що GORM може сильно сповільнювати роботу.

Живу в [object Object]. Прошу не турбувати.
Відповідь
#3

@Yulia_JS, чудове питання! У Go спільноті є два основні табори. Перші кажуть: 'Пишіть тільки сирий SQL через sqlx або pgx', бо це дає повний контроль і максимальну швидкість. Другі (і я серед них для швидких стартів) використовують GORM.

Насправді, оверхед GORM відчутний тільки на дуже великих обсягах даних. Для 90% сайтів він цілком підходить. Але якщо проект росте, краще дивитися в сторону sqlc — він генерує Go-код з ваших SQL-запитів. Це ідеальний баланс між швидкістю та типобезпекою.

Wink  Займаюсь розробкою сайтів, SEO просуванням: HTML, CSS, PHP, SEO, ADS, Ardilla-cms
Відповідь
#4

Стаття супер, але мене завжди лякає обробка помилок у Go. Як ви боретеся з нескінченними if err != nil? Це ж просто візуальний шум, який заважає читати логіку.

Event Loop крутиться — лавеха мутиться. JS is everything. React / TypeScript / Vite
Відповідь
#5

@Stas_Frontend, це класична претензія до Go від новачків. Smile Але з часом ти починаєш це цінувати. Ти завжди точно знаєш, де може статися помилка.

Щоб код був чистішим, використовуйте патерн Wrapping (через fmt.Errorf з дієсловом %w). Також у Go 1.22+ з'явилися нові можливості для структурованих логів. Порада: винесіть обробку помилок у окремі хелпери або використовуйте мідлварі для веб-серверів, щоб централізовано ловити паніки та помилки.

Wink  Займаюсь розробкою сайтів, SEO просуванням: HTML, CSS, PHP, SEO, ADS, Ardilla-cms
Відповідь
#6

Як адмін форуму, додам: Go — це спасіння для хостингу. На одному VPS за $5 можна тримати десятки маленьких сайтів на Go, тоді як PHP або Java з'їли б усю пам'ять.

Питання до автора: чи є сенс переходити на Go з PHP для створення звичайних лендінгів чи невеликих блогів?

Wink  Займаюсь розробкою сайтів, SEO просуванням: HTML, CSS, PHP, SEO, ADS, Ardilla-cms
Відповідь
#7

@rullan, чесно? Для лендінгів — навряд чи. PHP (особливо з сучасними фреймворками або CMS) дозволяє зібрати такий сайт за пару годин. Go вимагає більше 'ручної' роботи над базовими речами.

Але! Якщо ви робите сервіс, де буде багато API-запитів, чати на вебсокетах або обробка черг у реальному часі — Go просто не має конкурентів у ціновому сегменті 'залізо/продуктивність'.

Wink  Займаюсь розробкою сайтів, SEO просуванням: HTML, CSS, PHP, SEO, ADS, Ardilla-cms
Відповідь


Перейти на форум:


Користувачі, які переглядають цю тему: Гостей: 1