Fundamentos de la Filosofía de Go
10 ejemplos para empezar con la Filosofía de Go: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con la Filosofía de Go: 7 básicos y 3 intermedios.
go version).main Mínimo - Claridad PrimeroGo favorece un punto de entrada corto que conecta dependencias y ejecuta.
package main
import "fmt"
func main() {
fmt.Println("despliega programas pequeños y legibles")
}package main marca un ejecutable; el código de biblioteca usa otros nombres de paquete.main obvio mantiene el flujo de inicio fácil de auditar durante incidentes.Relacionado: Por qué existe Go - los objetivos de diseño detrás de este diseño
Los errores son valores devueltos junto con los resultados, no excepciones lanzadas.
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, "error al leer config: %v\n", err)
os.Exit(1)
}
fmt.Printf("cargados %d bytes\n", len(data))
}if err != nil es repetitivo por diseño; mantiene las rutas de fallo visibles en la revisión.fmt.Errorf("error al leer config: %w", err) preserva las causas para los logs.Relacionado: La Simplicidad como Restricción Deliberada en el Diseño de API - por qué las API devuelven errores simples
Go define interfaces donde se consumen, no donde se declaran los tipos.
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)
}La concurrencia es una característica de primera clase del lenguaje, no solo una preocupación de la biblioteca.
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string, 1)
go func() {
time.Sleep(50 * time.Millisecond)
ch <- "listo"
}()
fmt.Println(<-ch)
}go inicia una función de forma concurrente; el runtime la programa en hilos del sistema operativo.Relacionado: Por qué existe Go - modelo de concurrencia inspirado en CSP
defer para Limpieza ConfiableDefer registra la limpieza que se ejecuta cuando la función 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("hola")
return err
}
func main() {
if err := writeTemp(); err != nil {
panic(err)
}
fmt.Println("ok")
}defer empareja la adquisición con la liberación, incluso cuando existen múltiples rutas de retorno.defer se ejecutan LIFO al salir de la función, útil para bloqueos y archivos anidados.defer sobre la duplicación manual de limpieza en funciones largas.Go incluye herramientas para HTTP, JSON, TLS y testing en la cadena de herramientas que ya tienes.
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 es capaz de producción para muchos servicios antes de recurrir a Gin, Echo o chi.go test más rápidos en CI.Relacionado: Dominios Objetivo de Go - valores predeterminados nativos de la nube
Las pruebas documentan el comportamiento como filas de datos, coincidiendo con la preferencia de Go por la explicitud.
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, quiero %d", tc.a, tc.b, got, tc.want)
}
}
}go test es el punto de entrada universal de CI, no se requiere un ejecutor de pruebas adicional.context.Context en los Límites de la APILa cancelación y los plazos se propagan a través de los servicios al 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() solo en el main o el test harness más externo mantiene los árboles coherentes.Relacionado: Dominios Objetivo de Go - límites de servicios distribuidos
Las funciones públicas dependen de interfaces estrechas; los constructores exponen 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 {
// implementación omitida
return nil
}
func Save(ctx context.Context, s Store, key string, value []byte) error {
return s.Put(ctx, key, value)
}Save simulan Store sin importar los detalles internos de FileStore.NewFileStore) documentan la inicialización válida en un solo lugar.Relacionado: La Simplicidad como Restricción Deliberada en el Diseño de API - dar forma a API de paquetes estables
La filosofía incluye saber dónde gana otro lenguaje.
// Go sobresale: CLI binaria estática con flags y subcomandos.
// Considera Rust: rendimiento cercano al firmware sin GC.
// Considera Python: ciencia de datos exploratoria con iteración de notebooks.
// Considera JVM: integraciones empresariales maduras que tu equipo ya opera.
package main
import "fmt"
func main() {
fmt.Println("elige Go cuando la velocidad del equipo y la operabilidad dominen el ADR")
}Relacionado: Cuándo Go Es la Herramienta Equivocada - contraejemplos concretos | Go vs Rust - compensaciones de sistemas
Versiones de la Pila: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizadores - verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica los objetivos de la placa en la compilación), wazero (última - verifica en la compilación) y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026