Introdução: por que Go começou a ser usado em machine learning?
O mundo do machine learning (ML) foi monopolizado por Python e R por muito tempo. No entanto, com o aumento das demandas por desempenho, paralelismo e implantação de modelos em produção, os engenheiros estão cada vez mais olhando para Go (Golang). Apesar do ecossistema Go para ML ser significativamente inferior ao Python em número de bibliotecas, ele tem várias vantagens inegáveis: velocidade de execução, simplicidade de programação concorrente e facilidade de compilação em um único arquivo binário.
Neste artigo, vamos analisar as capacidades reais do Go para machine learning, suas limitações e fornecer exemplos práticos de código. Você aprenderá quando faz sentido usar Go e quando é melhor ficar com Python.
Principais capacidades do Go para machine learning
Go não é uma linguagem para Data Science "pronta para uso", mas pode ser usada efetivamente em certas etapas do pipeline de ML.
1. Processamento de dados de alto desempenho e ETL
Go lida muito bem com tarefas de pré-processamento de dados (ETL). Graças às goroutines e canais integrados, é possível ler, analisar e transformar gigabytes de dados em paralelo sem escrever código complexo.
package main
import (
"fmt"
"sync"
)
func processData(id int, wg *sync.WaitGroup) {
defer wg.Done()
// Simulação de processamento de dados
fmt.Printf("Processando dados da fonte %d", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go processData(i, &wg)
}
wg.Wait()
fmt.Println("Todos os dados processados.")
}
2. Bibliotecas para computação numérica e redes neurais
Existem projetos que trazem para Go capacidades semelhantes ao NumPy e TensorFlow:
- Gorgonia — biblioteca de baixo nível para diferenciação automática e construção de redes neurais. Análogo ao PyTorch em Go.
- GoML (go-ml) — conjunto de algoritmos clássicos de ML (regressão linear, KNN, clusterização).
- Gonum — pacote para cálculos numéricos (matrizes, estatística, otimização).
Exemplo de regressão linear simples usando Gonum:
package main
import (
"fmt"
"gonum.org/v1/gonum/mat"
"gonum.org/v1/gonum/stat"
)
func main() {
x := []float64{1, 2, 3, 4, 5}
y := []float64{2, 4, 6, 8, 10}
// Cálculo do coeficiente de correlação e regressão linear
alpha, beta := stat.LinearRegression(x, y, nil, false)
fmt.Printf("alpha (intercept): %f", alpha)
fmt.Printf("beta (slope): %f", beta)
}
3. Implantação de modelos (MLOps) e microsserviços
Go é a linguagem ideal para criar microsserviços. Se o seu modelo foi treinado em Python, você pode envolvê-lo em uma API REST em Go. Isso proporcionará um enorme ganho de desempenho em comparação com Flask ou FastAPI.
package main
import (
"encoding/json"
"net/http"
)
type PredictionRequest struct {
Features []float64 `json:"features"`
}
type PredictionResponse struct {
Result int `json:"result"`
}
func predictHandler(w http.ResponseWriter, r *http.Request) {
var req PredictionRequest
json.NewDecoder(r.Body).Decode(&req)
// Aqui a chamada do seu modelo (por exemplo, via gRPC ou REST para o serviço Python)
resp := PredictionResponse{Result: 1}
json.NewEncoder(w).Encode(resp)
}
func main() {
http.HandleFunc("/predict", predictHandler)
http.ListenAndServe(":8080", nil)
}
Limitações do Go em machine learning
Apesar dos pontos positivos, Go tem limitações sérias que o tornam inadequado para um stack de ML completo.
1. Falta de um ecossistema rico de Data Science
Em Python existem pandas, scikit-learn, TensorFlow, PyTorch, Jupyter Notebooks. Em Go não há nada