Noções Básicas da Filosofia Go
10 exemplos para você começar com a Filosofia Go - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com a Filosofia Go - 7 básicos e 3 intermediários.
go version).main Mínimo - Clareza em Primeiro LugarGo favorece um ponto de entrada curto que conecta dependências e executa.
package main
import "fmt"
func main() {
fmt.Println("entregue programas pequenos e legíveis")
}package main marca um executável; código de biblioteca usa outros nomes de pacotes.main óbvio mantém o fluxo de inicialização fácil de auditar durante incidentes.Relacionado: Por que Go Existe - os objetivos de design por trás deste layout
Erros são valores retornados ao lado de resultados, não exceções lançadas.
package main
import (
"fmt"
"os"
)
func readConfig(path string) ([]byte, error) {
return os.ReadFile(path)
}
func main() {
data, err := readConfig("config.yaml")
if err != nil {
fmt.Fprintf(os.Stderr, "ler configuração: %v\n", err)
os.Exit(1)
}
fmt.Printf("carregado %d bytes\n", len(data))
}if err != nil é repetitivo por design; mantém os caminhos de falha visíveis na revisão.fmt.Errorf("ler configuração: %w", err) preserva as causas para logs.Relacionado: Simplicidade como uma Restrição Deliberada no Design de API - por que as APIs retornam erros simples
Go define interfaces onde elas são consumidas, não onde os tipos são declarados.
package notify
import "context"
type Sender interface {
Send(ctx context.Context, msg string) error
}
func Deliver(ctx context.Context, s Sender, msg string) error {
return s.Send(ctx, msg)
}Concorrência é um recurso de primeira classe da linguagem, não apenas uma preocupação de biblioteca.
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string, 1)
go func() {
time.Sleep(50 * time.Millisecond)
ch <- "done"
}()
fmt.Println(<-ch)
}go inicia uma função concorrentemente; o runtime a agenda em threads do SO.Relacionado: Por que Go Existe - modelo de concorrência inspirado em CSP
defer para Limpeza ConfiávelDefer registra a limpeza que é executada quando a função circundante retorna.
package main
import (
"fmt"
"os"
)
func writeTemp() error {
f, err := os.CreateTemp("", "demo-*.txt")
if err != nil {
return err
}
defer func() {
f.Close()
os.Remove(f.Name())
}()
_, err = f.WriteString("hello")
return err
}
func main() {
if err := writeTemp(); err != nil {
panic(err)
}
fmt.Println("ok")
}defer emparelha aquisição com liberação, mesmo quando existem múltiplos caminhos de retorno.defer em vez de duplicação manual de limpeza em funções longas.Go envia "baterias incluídas" para HTTP, JSON, TLS e testes na ferramenta que você já possui.
package main
import (
"encoding/json"
"net/http"
)
type Health struct {
Status string `json:"status"`
}
func main() {
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(Health{Status: "ok"})
})
http.ListenAndServe(":8080", nil)
}net/http é capaz de produção para muitos serviços antes de você recorrer a Gin, Echo ou chi.go test mais rápidos em CI.Relacionado: Domínios de Destino do Go - padrões de nuvem nativa
Testes documentam o comportamento como linhas de dados, correspondendo à preferência do Go por explicitude.
package mathx
import "testing"
func Add(a, b int) int { return a + b }
func TestAdd(t *testing.T) {
cases := []struct {
a, b, want int
}{
{1, 2, 3},
{0, 0, 0},
{-1, 1, 0},
}
for _, tc := range cases {
if got := Add(tc.a, tc.b); got != tc.want {
t.Fatalf("Add(%d,%d)=%d, want %d", tc.a, tc.b, got, tc.want)
}
}
}go test é o ponto de entrada universal de CI - nenhum executor de teste adicional é necessário.context.Context nas Fronteiras da APICancelamento e prazos se propagam através de serviços no estilo Go.
package fetch
import (
"context"
"io"
"net/http"
"time"
)
func Get(ctx context.Context, url string) ([]byte, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}
func GetWithTimeout(url string, d time.Duration) ([]byte, error) {
ctx, cancel := context.WithTimeout(context.Background(), d)
defer cancel()
return Get(ctx, url)
}context.Background() apenas no main ou harness de teste mais externo mantém as árvores coerentes.Relacionado: Domínios de Destino do Go - fronteiras de serviços distribuídos
Funções públicas dependem de interfaces estreitas; construtores expõem tipos concretos.
package storage
import "context"
type Store interface {
Put(ctx context.Context, key string, value []byte) error
}
type FileStore struct {
dir string
}
func NewFileStore(dir string) *FileStore {
return &FileStore{dir: dir}
}
func (f *FileStore) Put(ctx context.Context, key string, value []byte) error {
// implementação omitida
return nil
}
func Save(ctx context.Context, s Store, key string, value []byte) error {
return s.Put(ctx, key, value)
}Save mockam Store sem importar os detalhes internos de FileStore.NewFileStore) documentam a inicialização válida em um único local.Relacionado: Simplicidade como uma Restrição Deliberada no Design de API - moldando APIs de pacotes estáveis
A filosofia inclui saber onde outra linguagem se destaca.
// Go se destaca: CLI binária estática com flags e subcomandos.
// Considere Rust: desempenho adjacente a firmware sem GC.
// Considere Python: ciência de dados exploratória com iteração em notebooks.
// Considere JVM: integrações empresariais maduras que sua equipe já opera.
package main
import "fmt"
func main() {
fmt.Println("escolha Go quando a velocidade da equipe e a operabilidade dominarem o ADR")
}Relacionado: Quando Go é a Ferramenta Errada - contraexemplos concretos | Go vs Rust - compensações de sistemas
Versões da Pilha: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC,
go fixmodernizadores - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026