Хотите ли вы писать на Go?

Ответ

Да, я заинтересован в изучении и использовании Go, особенно для определенных типов задач, где его сильные стороны могут дополнить мой основной стек (PHP/Laravel). Вот как я вижу применение Go в моей работе:

Области, где Go может быть эффективнее PHP:

  1. Высоконагруженные микросервисы — благодаря низкому потреблению памяти и быстрому запуску
  2. CLI-утилиты и инструменты DevOps — статическая компиляция и простой деплой
  3. Обработка потоков данных — горутины и каналы для параллельной обработки
  4. Сетевые приложения — встроенная поддержка HTTP/2, gRPC

Пример, где я бы использовал Go вместо PHP:

// Микросервис для обработки изображений
package main

import (
    "context"
    "image"
    "image/jpeg"
    "net/http"
    "os"
    "time"

    "github.com/nfnt/resize"
)

type ImageProcessor struct {
    cache map[string][]byte
}

func (ip *ImageProcessor) HandleResize(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
    defer cancel()

    // Обработка с учетом контекста (таймауты, отмена)
    select {
    case <-ctx.Done():
        http.Error(w, "Processing timeout", http.StatusRequestTimeout)
        return
    default:
        file, _, err := r.FormFile("image")
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        defer file.Close()

        img, _, err := image.Decode(file)
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }

        // Ресайз в горутине
        done := make(chan []byte)
        go func() {
            resized := resize.Resize(800, 0, img, resize.Lanczos3)
            var buf bytes.Buffer
            jpeg.Encode(&buf, resized, nil)
            done <- buf.Bytes()
        }()

        select {
        case result := <-done:
            w.Header().Set("Content-Type", "image/jpeg")
            w.Write(result)
        case <-ctx.Done():
            http.Error(w, "Processing timeout", http.StatusRequestTimeout)
        }
    }
}

func main() {
    processor := &ImageProcessor{
        cache: make(map[string][]byte),
    }

    http.HandleFunc("/resize", processor.HandleResize)
    http.ListenAndServe(":8080", nil)
}

Мой план изучения Go:

  1. Начать с инструментов для моих текущих PHP-проектов (миграции, генерация кода)
  2. Переписать на Go CPU-intensive части существующих приложений
  3. Разработать отдельный микросервис для обработки очередей или кэширования

Go привлекает меня своей простотой, производительностью и отличной поддержкой конкурентности, что делает его хорошим дополнением к PHP для определенных сценариев.

Ответ 18+ 🔞

Ну вот смотри, я тут подумал про Go, и знаешь, в чём прикол? Это же просто ёперный театр по сравнению с PHP для некоторых вещей! Я в основном на PHP/Laravel работаю, но есть моменты, когда хочется взять что-то попроще и побыстрее, чтобы не разводить манду с ушами из фреймворков.

Где Go просто рвёт PHP как Тузик грелку:

  1. Микросервисы, которые должны летать — тут даже спорить нечего. Памяти жрёт мало, запускается мгновенно, не надо с интерпретатором ебаться. Идеально для кучи мелких сервисов.
  2. Всякие консольные утилиты и DevOps-инструменты — скомпилировал один бинарник, кинул на сервер, и всё работает. Никаких зависимостей, доверия ебать ноль к окружению. Красота.
  3. Потоки данных гонять — вот эта их фишка с горутинами и каналами... Это же просто ни хуя себе! В PHP чтобы такое сделать, надо городить очереди, воркеры, а тут — на раз-два.
  4. Всё, что связано с сетью — там из коробки и HTTP/2, и gRPC. Сделать быстрый API или прокси — чих-пых.

Вот, например, где я бы на PHP заебался, а на Go сделал за вечер:

// Микросервис для обработки изображений
package main

import (
    "context"
    "image"
    "image/jpeg"
    "net/http"
    "os"
    "time"

    "github.com/nfnt/resize"
)

type ImageProcessor struct {
    cache map[string][]byte
}

func (ip *ImageProcessor) HandleResize(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
    defer cancel()

    // Обработка с учетом контекста (таймауты, отмена)
    select {
    case <-ctx.Done():
        http.Error(w, "Processing timeout", http.StatusRequestTimeout)
        return
    default:
        file, _, err := r.FormFile("image")
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        defer file.Close()

        img, _, err := image.Decode(file)
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }

        // Ресайз в горутине
        done := make(chan []byte)
        go func() {
            resized := resize.Resize(800, 0, img, resize.Lanczos3)
            var buf bytes.Buffer
            jpeg.Encode(&buf, resized, nil)
            done <- buf.Bytes()
        }()

        select {
        case result := <-done:
            w.Header().Set("Content-Type", "image/jpeg")
            w.Write(result)
        case <-ctx.Done():
            http.Error(w, "Processing timeout", http.StatusRequestTimeout)
        }
    }
}

func main() {
    processor := &ImageProcessor{
        cache: make(map[string][]byte),
    }

    http.HandleFunc("/resize", processor.HandleResize)
    http.ListenAndServe(":8080", nil)
}

Видишь? Контексты для таймаутов, горутина для тяжёлой работы — элегантно и без овердохуища кода. В PHP пришлось бы ставить в очередь через Redis и писать отдельного воркера, ебушки-воробушки.

Как я это всё осваивать собираюсь, чтобы не обосраться:

  1. Начну с мелких утилиток для своих же PHP-проектов. Типа скриптов для миграций или генерации какого-нибудь кода. Подозрение ебать чувствую, что там Go будет в кайф.
  2. Потом возьму какой-нибудь один тяжёлый модуль в существующем приложении (тот же ресайз картинок или парсинг логов) и перепишу его на Go как отдельный сервис. Посмотрю, что получится.
  3. Если не накроется медным тазом, то сделаю целый микросервис для очередей или кэша. Это уже серьёзная заявка.

Короче, Go меня подкупает своей простотой, скоростью и тем, как он конкурентность обрабатывает. Не вместо PHP, а вместе с ним — для тех задач, где PHP хуй с горы.