ГлавнаяБлогКак PHP-разработчику освоить Go: ментальная карта
Алгоритмы

Как PHP-разработчику освоить Go: ментальная карта

Пошаговое руководство для PHP-разработчика, который хочет выучить Go. Узнайте, как перенести свой опыт на Go, разобраться с типами, интерфейсами и ошибками. Начните писать продакшн-код уже сегодня.

Al
Редакция Algolitalgolit.ru
12 мин чтения27 июня 2026 г.

Зачем PHP-разработчику Go?

Если вы — опытный PHP-разработчик, который использует Laravel или Symfony, вы уже знаете, как устроены бэкенд-системы: бизнес-логика, базы данных, очереди, кеширование. Go открывает доступ к рынку, где платят больше, а задачи сложнее — инфраструктура, высоконагруженные сервисы, финтех. Но главное: Go меняет способ мышления. Эта статья — не про синтаксис, а про то, как Go хочет, чтобы вы строили программы.

Ментальная карта: PHP vs Go

Вот таблица, которая поможет быстро переключиться. Держите её под рукой.

  • PHP / Laravel: Фреймворк управляет жизненным циклом. Go: Вы сами пишете main().
  • PHP / Laravel: Service-контейнер разрешает зависимости. Go: Вы явно передаёте зависимости через конструкторы.
  • PHP / Laravel: Исключения всплывают вверх. Go: Ошибки — это значения.
  • PHP / Laravel: Магические методы, ORM, фасады. Go: Стандартная библиотека + маленькие пакеты.
  • PHP / Laravel: FPM-процесс на каждый запрос. Go: Один долгоживущий бинарник.

Синтаксис: быстро, но не застревайте

Синтаксис Go прост. Вот пример функции:

package main

import "fmt"

func CalculateDiscount(amount int) int {
    if amount >= 500 {
        return 50
    }
    if amount >= 100 {
        return 10
    }
    return 0
}

func main() {
    fmt.Println(CalculateDiscount(150))
}

Обратите внимание: заглавная буква C — не стиль, а способ экспорта. В Go видимость определяется регистром первой буквы: заглавная — публичный, строчная — приватный.

Более идиоматичный пример со структурой:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    ID    int64  `json:"id"`
    Email string `json:"email"`
    Name  string `json:"name"`
}

func main() {
    user := User{
        ID:    1,
        Email: "anna@example.com",
        Name:  "Anna",
    }
    data, err := json.Marshal(user)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

Здесь видны ключевые идеи: struct вместо ассоциативных массивов, теги для JSON, явная обработка ошибок. Изучите Tour of Go за пару вечеров, затем Effective Go.

Система типов: статика — это просто

Go статически типизирован, но типы просты. Пример доменной модели:

type User struct {
    ID        int64
    Email     string
    FirstName string
    LastName  string
}

func (u User) FullName() string {
    return u.FirstName + " " + u.LastName
}

Это не класс. Go не использует наследование. Вы определяете данные через struct и прикрепляете поведение через методы с получателем. Используйте получатель-указатель, если метод изменяет структуру или структура большая; иначе — получатель-значение.

Нулевые значения

Каждый тип в Go имеет нулевое значение:

var count int       // 0
var name string     // ""
var active bool     // false
var user *User      // nil
var tags []string   // nil (работает с len и range)
var lookup map[string]int // nil (чтение безопасно, запись — panic!)

Проверяйте конфигурацию при старте:

type Config struct {
    DatabaseURL string
    Port        int
}

func (c Config) Validate() error {
    if c.DatabaseURL == "" {
        return fmt.Errorf("database URL is required")
    }
    if c.Port <= 0 {
        return fmt.Errorf("port must be greater than zero")
    }
    return nil
}

Важно: запись в nil-мапу вызывает панику. Всегда инициализируйте мапы через make.

Интерфейсы: контракты поведения

Интерфейсы в Go удовлетворяются неявно. Вот пример:

type UserRepository interface {
    FindByID(ctx context.Context, id int64) (*User, error)
}

type PostgresUserRepository struct {
    db *sql.DB
}

func (r *PostgresUserRepository) FindByID(ctx context.Context, id int64) (*User, error) {
    // запрос к базе
    return nil, nil
}

PostgresUserRepository автоматически удовлетворяет UserRepository, потому что у него есть метод FindByID с правильной сигнатурой. Никакого ключевого слова implements.

Принято определять маленькие интерфейсы там, где они используются:

type UserService struct {
    users interface {
        FindByID(ctx context.Context, id int64) (*User, error)
    }
}

Это позволяет легко подменять реализацию. Правило: «принимай интерфейсы, возвращай структуры».

Не ищите аналог Laravel

Многие PHP-разработчики спрашивают: «Что в Go вместо Laravel?» Это неправильный вопрос. Laravel — это фреймворк с батарейками. Go предлагает стандартную библиотеку и маленькие пакеты. Вам не нужен монолитный фреймворк — вы сами собираете приложение из кирпичиков.

Практический вывод

Начните с малого: напишите CLI-утилиту, затем HTTP-сервер. Постепенно внедряйте Go в рабочие проекты. Через месяц вы заметите, как изменилось ваше мышление. Go — это не просто новый язык, это новый способ строить надёжные системы.

#Go#PHP#миграция#типы#интерфейсы
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →