Go

Como Usar Deploy de APIs Go em Produção: VPS, Kubernetes e GitHub Actions em Produção

20 min de leitura

Como Usar Deploy de APIs Go em Produção: VPS, Kubernetes e GitHub Actions em Produção

Introdução: Por Que Go é Ideal para APIs em Produção Go é uma linguagem compilada, estaticamente tipada e com foco em concorrência. Quando falamos de deploy em produção, você precisa de uma linguagem que seja rápida, confiável e fácil de operar. Go atende todos esses requisitos. Um único binário, sem dependências externas de runtime, torna a implantação em VPS extremamente simples. Além disso, a comunidade Go tem um ecossistema maduro com frameworks como Gin, Echo e Chi que facilitam a construção de APIs robustas. O objetivo deste artigo é guiá-lo através de três cenários reais de deploy: em uma VPS tradicional, em um cluster Kubernetes e automatizando tudo com GitHub Actions. Você aprenderá não apenas como fazer, mas por que cada abordagem faz sentido em diferentes contextos. Entendendo a API Go que Vamos Deployar Estrutura Básica de uma API Go Antes de falar de deploy, você precisa entender o que estamos implantando. Vou usar o framework Echo, que é lightweight

<h2>Introdução: Por Que Go é Ideal para APIs em Produção</h2>

<p>Go é uma linguagem compilada, estaticamente tipada e com foco em concorrência. Quando falamos de deploy em produção, você precisa de uma linguagem que seja rápida, confiável e fácil de operar. Go atende todos esses requisitos. Um único binário, sem dependências externas de runtime, torna a implantação em VPS extremamente simples. Além disso, a comunidade Go tem um ecossistema maduro com frameworks como Gin, Echo e Chi que facilitam a construção de APIs robustas.</p>

<p>O objetivo deste artigo é guiá-lo através de três cenários reais de deploy: em uma VPS tradicional, em um cluster Kubernetes e automatizando tudo com GitHub Actions. Você aprenderá não apenas como fazer, mas por que cada abordagem faz sentido em diferentes contextos.</p>

<h2>Entendendo a API Go que Vamos Deployar</h2>

<h3>Estrutura Básica de uma API Go</h3>

<p>Antes de falar de deploy, você precisa entender o que estamos implantando. Vou usar o framework Echo, que é lightweight e production-ready. Uma API simples com autenticação básica, logging e tratamento de erros será nosso exemplo.</p>

<pre><code class="language-go">package main

import (

&quot;log&quot;

&quot;net/http&quot;

&quot;os&quot;

&quot;time&quot;

&quot;github.com/labstack/echo/v4&quot;

&quot;github.com/labstack/echo/v4/middleware&quot;

)

type Product struct {

ID int json:&quot;id&quot;

Name string json:&quot;name&quot;

Price float64 json:&quot;price&quot;

}

func main() {

// Inicializar Echo

e := echo.New()

// Middleware de logging

e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{

Format: &quot;[${time_rfc3339}] ${method} ${uri} ${status} ${latency_human}\n&quot;,

}))

// Middleware de recuperação de panics

e.Use(middleware.Recover())

// Rota de saúde (importante para healthchecks)

e.GET(&quot;/health&quot;, func(c echo.Context) error {

return c.JSON(http.StatusOK, map[string]string{

&quot;status&quot;: &quot;ok&quot;,

&quot;time&quot;: time.Now().UTC().String(),

})

})

// Rota de produtos

e.GET(&quot;/api/products&quot;, getProducts)

e.POST(&quot;/api/products&quot;, createProduct)

// Obter porta da variável de ambiente ou usar padrão

port := os.Getenv(&quot;PORT&quot;)

if port == &quot;&quot; {

port = &quot;8080&quot;

}

log.Printf(&quot;Server starting on port %s\n&quot;, port)

if err := e.Start(&quot;:&quot; + port); err != nil {

log.Fatalf(&quot;Server error: %v\n&quot;, err)

}

}

func getProducts(c echo.Context) error {

products := []Product{

{ID: 1, Name: &quot;Notebook&quot;, Price: 2500.00},

{ID: 2, Name: &quot;Mouse&quot;, Price: 50.00},

}

return c.JSON(http.StatusOK, products)

}

func createProduct(c echo.Context) error {

p := new(Product)

if err := c.BindJSON(&amp;p); err != nil {

return c.JSON(http.StatusBadRequest, map[string]string{

&quot;error&quot;: &quot;Invalid JSON&quot;,

})

}

return c.JSON(http.StatusCreated, p)

}</code></pre>

<p>Este código é minimalista, mas representa uma API real: tem rota de health check (essencial para monitoramento), logging estruturado, middleware de recuperação, e usa variáveis de ambiente. Essas práticas são fundamentais quando você vai para produção.</p>

<h3>Preparando o Projeto para Produção</h3>

<p>Você precisa de um arquivo <code>go.mod</code> e <code>go.sum</code> versionados. Crie um <code>Dockerfile</code> para containerizar a aplicação, pois isso facilita deploy tanto em VPS quanto em Kubernetes:</p>

<pre><code class="language-dockerfile"># Build stage

FROM golang:1.21-alpine AS builder

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o api-go .

Runtime stage

FROM alpine:3.18

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=builder /app/api-go .

EXPOSE 8080

ENV PORT=8080

CMD [&quot;./api-go&quot;]</code></pre>

<p>Essa abordagem multi-stage reduz o tamanho da imagem final. O primeiro stage compila o Go (que tira o binário), o segundo stage usa apenas Alpine Linux com o binário pronto. Isso resulta em imagens de ~20MB em vez de 800MB.</p>

<h2>Deploy em VPS: Simplicidade e Controle Total</h2>

<h3>Configuração do Servidor</h3>

<p>Um deploy em VPS é a abordagem mais simples. Você terá controle total, menos abstrações, e custos previsíveis. A maioria das VPS oferece Ubuntu 22.04 LTS, que é estável e bem suportada. O fluxo é: build local → upload binário → execute com um gerenciador de processo.</p>

<p>Primeiro, provisionando a VPS, você precisa de SSH configurado, firewall adequado e um usuário não-root. Instale Go ou Docker (se optar por container):</p>

<pre><code class="language-bash">#!/bin/bash

Script de setup inicial da VPS

sudo apt update &amp;&amp; sudo apt upgrade -y

sudo apt install -y curl wget git ca-certificates

Instalar Docker (opcional mas recomendado)

curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh get-docker.sh

sudo usermod -aG docker $USER

Criar diretório para a aplicação

sudo mkdir -p /opt/api-go

sudo chown $USER:$USER /opt/api-go</code></pre>

<h3>Build e Deploy Manual</h3>

<p>Localmente, compile seu binário Go para Linux:</p>

<pre><code class="language-bash"># No seu computador ou no runner

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o api-go-linux .

Upload para VPS via SCP

scp api-go-linux user@seu-vps.com:/opt/api-go/

Conectar via SSH e executar

ssh user@seu-vps.com

cd /opt/api-go

chmod +x api-go-linux

./api-go-linux</code></pre>

<p>Mas executar manualmente não é prático. Use Systemd para gerenciar o processo:</p>

<pre><code class="language-ini"># /etc/systemd/system/api-go.service

[Unit]

Description=Go API Service

After=network.target

[Service]

Type=simple

User=appuser

WorkingDirectory=/opt/api-go

ExecStart=/opt/api-go/api-go-linux

Restart=on-failure

RestartSec=10

StandardOutput=journal

StandardError=journal

Limites de recursos

LimitNOFILE=65536

LimitNPROC=65536

Variáveis de ambiente

Environment=&quot;PORT=8080&quot;

Environment=&quot;ENV=production&quot;

[Install]

WantedBy=multi-user.target</code></pre>

<p>Ativar e iniciar:</p>

<pre><code class="language-bash">sudo systemctl daemon-reload

sudo systemctl enable api-go

sudo systemctl start api-go

sudo systemctl status api-go</code></pre>

<h3>Reverse Proxy com Nginx</h3>

<p>Nunca exponha sua aplicação Go diretamente na porta 80/443. Use um reverse proxy. Nginx é leve e eficiente:</p>

<pre><code class="language-nginx"># /etc/nginx/sites-available/api-go

server {

listen 80;

server_name seu-dominio.com;

Redirecionar HTTP para HTTPS

return 301 https://$server_name$request_uri;

}

server {

listen 443 ssl http2;

server_name seu-dominio.com;

ssl_certificate /etc/letsencrypt/live/seu-dominio.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/seu-dominio.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

Logs

access_log /var/log/nginx/api-go-access.log;

error_log /var/log/nginx/api-go-error.log;

Proxy para sua API Go

location / {

proxy_pass http://127.0.0.1:8080;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_http_version 1.1;

proxy_set_header Connection &quot;&quot;;

}

Health check endpoint

location /health {

proxy_pass http://127.0.0.1:8080/health;

access_log off;

}

}</code></pre>

<p>Use Certbot para SSL gratuito com Let&#039;s Encrypt:</p>

<pre><code class="language-bash">sudo apt install certbot python3-certbot-nginx

sudo certbot certonly --nginx -d seu-dominio.com</code></pre>

<p><strong>Por que essa abordagem?</strong> VPS é ideal para aplicações pequenas e médias. Você tem controle total, debugar é simples (logs em <code>/var/log</code> ou via journalctl), e não há overhead de orquestração. O custo é entre $5-20/mês.</p>

<h2>Deploy em Kubernetes: Escalabilidade e Automação</h2>

<h3>Quando Usar Kubernetes</h3>

<p>Kubernetes é complexo, mas resolve problemas reais em larga escala: orquestração automática de containers, escalabilidade horizontal, service discovery, rolling updates sem downtime. Se sua API precisa servir milhões de requisições e lidar com falhas automaticamente, Kubernetes é o caminho.</p>

<p>Vou assumir um cluster Kubernetes gerenciado (como GKE, EKS ou DigitalOcean Kubernetes). Você precisará de <code>kubectl</code> instalado e acesso ao cluster.</p>

<h3>Containerizar a Aplicação</h3>

<p>Você já tem o Dockerfile. Agora build e push para um registry:</p>

<pre><code class="language-bash"># Build da imagem

docker build -t seu-usuario/api-go:1.0.0 .

Login no Docker Hub (ou seu registry)

docker login

Push

docker push seu-usuario/api-go:1.0.0</code></pre>

<h3>Manifest Kubernetes</h3>

<p>Crie arquivos de configuração. Primeiro, um Deployment:</p>

<pre><code class="language-yaml"># deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: api-go

labels:

app: api-go

spec:

replicas: 3 # 3 instâncias sempre rodando

selector:

matchLabels:

app: api-go

strategy:

type: RollingUpdate

rollingUpdate:

maxSurge: 1

maxUnavailable: 0 # Zero downtime

template:

metadata:

labels:

app: api-go

spec:

containers:

  • name: api-go

image: seu-usuario/api-go:1.0.0

imagePullPolicy: Always

ports:

  • containerPort: 8080

name: http

env:

  • name: PORT

value: &quot;8080&quot;

  • name: ENV

value: &quot;production&quot;

Health checks

livenessProbe:

httpGet:

path: /health

port: http

initialDelaySeconds: 10

periodSeconds: 30

timeoutSeconds: 5

failureThreshold: 3

readinessProbe:

httpGet:

path: /health

port: http

initialDelaySeconds: 5

periodSeconds: 10

timeoutSeconds: 3

failureThreshold: 3

Limites de recursos

resources:

requests:

cpu: 100m

memory: 128Mi

limits:

cpu: 500m

memory: 512Mi

Graceful shutdown

lifecycle:

preStop:

exec:

command: [&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;sleep 15&quot;]</code></pre>

<p>Depois, um Service para expor a aplicação:</p>

<pre><code class="language-yaml"># service.yaml

apiVersion: v1

kind: Service

metadata:

name: api-go

labels:

app: api-go

spec:

type: ClusterIP # Interno, exposto via Ingress

ports:

  • port: 80

targetPort: 8080

protocol: TCP

name: http

selector:

app: api-go</code></pre>

<p>E um Ingress para roteamento HTTP/HTTPS:</p>

<pre><code class="language-yaml"># ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: api-go

annotations:

cert-manager.io/cluster-issuer: letsencrypt-prod

nginx.ingress.kubernetes.io/rate-limit: &quot;100&quot;

spec:

ingressClassName: nginx

tls:

  • hosts:
  • seu-dominio.com

secretName: api-go-tls

rules:

  • host: seu-dominio.com

http:

paths:

  • path: /

pathType: Prefix

backend:

service:

name: api-go

port:

number: 80</code></pre>

<h3>Aplicando no Cluster</h3>

<pre><code class="language-bash">kubectl apply -f deployment.yaml

kubectl apply -f service.yaml

kubectl apply -f ingress.yaml

Verificar status

kubectl get pods

kubectl get svc

kubectl get ingress

Ver logs de um pod

kubectl logs -f deployment/api-go

Acessar shell de um pod (para debug)

kubectl exec -it &lt;pod-name&gt; -- sh</code></pre>

<h3>Atualizando a Aplicação</h3>

<p>Quando você tem uma nova versão, atualize a tag da imagem no Deployment:</p>

<pre><code class="language-bash">kubectl set image deployment/api-go api-go=seu-usuario/api-go:1.0.1 --record

Ou edite manualmente

kubectl edit deployment api-go</code></pre>

<p>Kubernetes fará um rolling update: novos pods com a nova versão são criados enquanto os antigos são gracefully desligados. Zero downtime.</p>

<p><strong>Por que essa abordagem?</strong> Kubernetes é ideal quando você tem equipes maiores, múltiplas aplicações, e precisa de escalabilidade automática. Mas tem custo de complexidade: você precisa entender networking, storage, RBAC, etc.</p>

<h2>CI/CD com GitHub Actions: Automação Completa</h2>

<h3>Por Que Automatizar?</h3>

<p>Deploy manual é propenso a erros. GitHub Actions permite que você defina um pipeline: quando faz push para <code>main</code>, o código é testado, builtado, deployado automaticamente. Você dorme tranquilo.</p>

<h3>Estrutura do Workflow</h3>

<p>Crie um arquivo <code>.github/workflows/deploy.yaml</code>:</p>

<pre><code class="language-yaml">name: Build and Deploy

on:

push:

branches:

  • main

pull_request:

branches:

  • main

env:

REGISTRY: docker.io

IMAGE_NAME: seu-usuario/api-go

jobs:

test:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v4
  • name: Set up Go

uses: actions/setup-go@v4

with:

go-version: &#039;1.21&#039;

  • name: Run Tests

run: go test -v ./...

  • name: Run Linter

uses: golangci/golangci-lint-action@v3

with:

version: latest

  • name: Build Binary

run: |

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 \

go build -o api-go-linux .

build:

needs: test

runs-on: ubuntu-latest

if: github.event_name == &#039;push&#039; &amp;&amp; github.ref == &#039;refs/heads/main&#039;

steps:

  • uses: actions/checkout@v4
  • name: Set up Docker Buildx

uses: docker/setup-buildx-action@v2

  • name: Login to Docker Hub

uses: docker/login-action@v2

with:

username: ${{ secrets.DOCKER_USERNAME }}

password: ${{ secrets.DOCKER_PASSWORD }}

  • name: Extract metadata

id: meta

uses: docker/metadata-action@v4

with:

images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

tags: |

type=ref,event=branch

type=semver,pattern={{version}}

type=sha,prefix={{branch}}-

  • name: Build and push

uses: docker/build-push-action@v4

with:

context: .

push: true

tags: ${{ steps.meta.outputs.tags }}

labels: ${{ steps.meta.outputs.labels }}

cache-from: type=gha

cache-to: type=gha,mode=max

deploy-vps:

needs: build

runs-on: ubuntu-latest

if: github.event_name == &#039;push&#039; &amp;&amp; github.ref == &#039;refs/heads/main&#039;

steps:

  • uses: actions/checkout@v4
  • name: Deploy to VPS

uses: appleboy/ssh-action@master

with:

host: ${{ secrets.VPS_HOST }}

username: ${{ secrets.VPS_USER }}

key: ${{ secrets.VPS_SSH_KEY }}

script: |

cd /opt/api-go

docker pull seu-usuario/api-go:main

docker stop api-go | | true docker rm api-go || true

docker run -d \

--name api-go \

--restart unless-stopped \

-p 127.0.0.1:8080:8080 \

-e PORT=8080 \

-e ENV=production \

seu-usuario/api-go:main

echo &quot;Waiting for health check...&quot;

sleep 5

curl -f http://localhost:8080/health || exit 1

echo &quot;Deployment successful!&quot;

deploy-kubernetes:

needs: build

runs-on: ubuntu-latest

if: github.event_name == &#039;push&#039; &amp;&amp; github.ref == &#039;refs/heads/main&#039;

steps:

  • uses: actions/checkout@v4
  • name: Set up kubectl

uses: azure/setup-kubectl@v3

with:

version: &#039;latest&#039;

  • name: Configure kubectl

run: |

mkdir -p $HOME/.kube

echo &quot;${{ secrets.KUBE_CONFIG }}&quot; | base64 -d &gt; $HOME/.kube/config

chmod 600 $HOME/.kube/config

  • name: Update image in Deployment

run: |

kubectl set image deployment/api-go \

api-go=seu-usuario/api-go:main \

--record

  • name: Wait for rollout

run: kubectl rollout status deployment/api-go --timeout=5m

  • name: Health check

run: |

POD=$(kubectl get pods -l app=api-go -o jsonpath=&#039;{.items[0].metadata.name}&#039;)

kubectl exec $POD -- wget -qO- http://localhost:8080/health</code></pre>

<h3>Configurar Secrets</h3>

<p>No repositório GitHub, vá em Settings → Secrets and Variables → Actions e adicione:</p>

<ul>

<li><code>DOCKER_USERNAME</code>: seu usuário Docker Hub</li>

<li><code>DOCKER_PASSWORD</code>: seu token Docker Hub</li>

<li><code>VPS_HOST</code>: IP ou domínio da VPS</li>

<li><code>VPS_USER</code>: usuário SSH</li>

<li><code>VPS_SSH_KEY</code>: chave privada SSH (sem passphrase)</li>

</ul>

<p>- <code>KUBE_CONFIG</code>: arquivo kubeconfig em base64 (<code>cat ~/.kube/config | base64</code>)</p>

<h3>Análise do Pipeline</h3>

<p>O workflow acima faz:</p>

<ol>

<li><strong>test</strong>: A cada push, testa o código com <code>go test</code>, roda linter (golangci-lint detecta bugs e estilo ruim), builda o binário.</li>

<li><strong>build</strong>: Se tudo passou e é push em <code>main</code>, constrói a imagem Docker e faz push ao registry.</li>

<li><strong>deploy-vps</strong>: Conecta via SSH, faz pull da nova imagem, reinicia o container com <code>docker run</code>, valida com health check.</li>

<li><strong>deploy-kubernetes</strong>: Atualiza o Deployment no cluster, aguarda o rollout ser concluído.</li>

</ol>

<p>Ambos os deploys rodam em paralelo (<code>needs: build</code>), economizando tempo.</p>

<h3>Tagging Automático</h3>

<p>Para versionamento semântico, crie tags Git e o GitHub Actions pega automaticamente:</p>

<pre><code class="language-bash">git tag -a v1.0.0 -m &quot;Release v1.0.0&quot;

git push origin v1.0.0</code></pre>

<p>O workflow de <code>build</code> está configurado para criar tags Docker automáticas baseadas em tags Git.</p>

<p><strong>Por que essa abordagem?</strong> GitHub Actions reduz erros humanos, garante que apenas código testado é deployado, e permite que você desligue e o sistema continue funcionando. É essencial em qualquer operação seria.</p>

<h2>Boas Práticas e Considerações Operacionais</h2>

<h3>Monitoramento e Logging</h3>

<p>Sua API precisa ser observável. Implemente logging estruturado:</p>

<pre><code class="language-go">import &quot;github.com/sirupsen/logrus&quot;

var log = logrus.New()

func main() {

log.SetFormatter(&amp;logrus.JSONFormatter{})

log.SetLevel(logrus.InfoLevel)

log.Info(&quot;Application started&quot;)

}</code></pre>

<p>Em produção, agregue logs em um serviço como ELK Stack, DataDog ou CloudWatch. Seu <code>/health</code> endpoint é fundamental para alertas.</p>

<h3>Versionamento e Rollback</h3>

<p>Sempre tagueie releases. Se algo quebrar:</p>

<pre><code class="language-bash"># VPS

docker run -d seu-usuario/api-go:v1.0.0

Kubernetes

kubectl rollout undo deployment/api-go</code></pre>

<h3>Secrets e Configuração</h3>

<p>Nunca committe secrets. Use variáveis de ambiente ou gerenciadores como:</p>

<ul>

<li><strong>VPS</strong>: <code>/etc/api-go/.env</code> (arquivo local, não versionado)</li>

<li><strong>Kubernetes</strong>: <code>Secret</code> resources</li>

<li><strong>GitHub Actions</strong>: Secrets</li>

</ul>

<pre><code class="language-yaml"># Kubernetes Secret

apiVersion: v1

kind: Secret

metadata:

name: api-go-secrets

type: Opaque

stringData:

DATABASE_URL: postgresql://user:pass@db:5432/api

API_KEY: seu-chave-secreta</code></pre>

<pre><code class="language-yaml"># Usar no Deployment

env:

  • name: DATABASE_URL

valueFrom:

secretKeyRef:

name: api-go-secrets

key: DATABASE_URL</code></pre>

<h3>Testes em Produção</h3>

<p>Sempre teste localmente antes de fazer push:</p>

<pre><code class="language-bash"># Build e test local

go build

go test -v ./...

Ou com Docker

docker build -t api-go:test .

docker run -p 8080:8080 api-go:test

curl http://localhost:8080/health</code></pre>

<h2>Conclusão</h2>

<p>Você aprendeu três paradigmas complementares: <strong>VPS é simplicidade e controle</strong>, ideal para projetos menores onde você gerencia manualmente. <strong>Kubernetes é complexidade e escalabilidade</strong>, necessário quando você tem múltiplas instâncias e precisa de automação sofisticada. <strong>GitHub Actions é o glue que une tudo</strong>, garantindo que código testado é deployado automaticamente.</p>

<p>A realidade profissional é que você frequentemente usa os três: develop e test localmente, push para GitHub Actions que testa e builda, depois choose entre deployar em VPS (para staging) ou Kubernetes (para produção em escala). O importante é automatizar o máximo possível e ter um rollback plan.</p>

<p>Pratique: crie uma API simples, faça deploy em uma VPS trial (DigitalOcean oferece $200 de crédito), configure GitHub Actions, e integre com Kubernetes se seu cluster oferece trial (GKE, EKS têm tiers free). Erros em teste são ouro; erros em produção são disaster.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://echo.labstack.com" target="_blank" rel="noopener noreferrer">Echo Framework - Go HTTP Framework</a></li>

<li><a href="https://kubernetes.io/docs" target="_blank" rel="noopener noreferrer">Kubernetes Official Documentation</a></li>

<li><a href="https://docs.github.com/en/actions" target="_blank" rel="noopener noreferrer">GitHub Actions - Build, Test and Deploy</a></li>

<li><a href="https://docs.docker.com/develop/dev-best-practices/" target="_blank" rel="noopener noreferrer">Docker Best Practices</a></li>

<li><a href="https://12factor.net" target="_blank" rel="noopener noreferrer">The Twelve-Factor App</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em Go

Como Usar Structs em Go: Definição, Embedding e Métodos em Produção
Como Usar Structs em Go: Definição, Embedding e Métodos em Produção

Structs em Go: Definição, Embedding e Métodos O que é uma Struct e Por Que Us...

Guia Completo de Context em Go: Cancelamento, Timeout e Propagação de Valores
Guia Completo de Context em Go: Cancelamento, Timeout e Propagação de Valores

Context em Go: Cancelamento, Timeout e Propagação de Valores O é um dos pacot...

Dominando Interface Vazia e Type Assertions em Go: any e Conversões de Tipo em Projetos Reais
Dominando Interface Vazia e Type Assertions em Go: any e Conversões de Tipo em Projetos Reais

O que é a Interface Vazia em Go A interface vazia, representada por , é um do...