Пошаговое руководство для PHP-разработчика, который хочет выучить Go. Узнайте, как перенести свой опыт на Go, разобраться с типами, интерфейсами и ошибками. Начните писать продакшн-код уже сегодня.
Если вы — опытный PHP-разработчик, который использует Laravel или Symfony, вы уже знаете, как устроены бэкенд-системы: бизнес-логика, базы данных, очереди, кеширование. Go открывает доступ к рынку, где платят больше, а задачи сложнее — инфраструктура, высоконагруженные сервисы, финтех. Но главное: Go меняет способ мышления. Эта статья — не про синтаксис, а про то, как Go хочет, чтобы вы строили программы.
Вот таблица, которая поможет быстро переключиться. Держите её под рукой.
main().Синтаксис 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)
}
}Это позволяет легко подменять реализацию. Правило: «принимай интерфейсы, возвращай структуры».
Многие PHP-разработчики спрашивают: «Что в Go вместо Laravel?» Это неправильный вопрос. Laravel — это фреймворк с батарейками. Go предлагает стандартную библиотеку и маленькие пакеты. Вам не нужен монолитный фреймворк — вы сами собираете приложение из кирпичиков.
Начните с малого: напишите CLI-утилиту, затем HTTP-сервер. Постепенно внедряйте Go в рабочие проекты. Через месяц вы заметите, как изменилось ваше мышление. Go — это не просто новый язык, это новый способ строить надёжные системы.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →