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

«Хотите ли вы писать на Go?» — вопрос из категории Софт-скиллы, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Да, я заинтересован в изучении и использовании 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 для определенных сценариев.