Saltar al contenido principal
eLearner.app
Módulo 10 · Lección 1 de 546/50 en el curso~10 min
Lecciones del módulo (1/5)

Convenciones de nombres y estilo

Go tiene convenciones de estilo y nomenclatura fuertes y no negociables: el formateador oficial gofmt (y su superconjunto goimports) decide la sangría, el espaciado y el orden de importación. Hablar de estilo se considera fuera de tema: ejecuta gofmt -w y sigue adelante. Esto libera energía para problemas más interesantes.

Visibilidad: mayúsculas o minúsculas

No hay palabras clave public/private. La primera letra del nombre determina la visibilidad:

  • Mayúsculas → exportado fuera del paquete (User, Login, MaxRetries).
  • minúsculas → privado del paquete (user, parseLine, defaultTimeout).

Esto se aplica a: tipos, funciones, métodos, variables, constantes, campos de estructura.

Go
type User struct {
    Name  string  // exported
    email string  // private to the package
}

Un campo de estructura "privado" no está serializado por encoding/json (consulte el Módulo 8) y no es accesible desde las pruebas en pkg_test.

CamelCase, nunca Snake_case

Sin guiones bajos en nombres de varias palabras:

  • ✅ CÓDIGOPH0, CÓDIGOPH1, CÓDIGOPH2
  • ❌ CÓDIGOPH3, CÓDIGOPH4, CÓDIGOPH5

Las siglas van todas en mayúsculas (o todas en minúsculas, si son de ámbito privado):

  • ✅ CÓDIGOPH0, CÓDIGOPH1, CÓDIGOPH2, CÓDIGOPH3, CÓDIGOPH4, CÓDIGOPH5
  • ❌ CÓDIGOPH6, CÓDIGOPH7, CÓDIGOPH8, CÓDIGOPH9, CÓDIGOPH10, CÓDIGOPH11
Go
type APIResponse struct {
    UserID  int
    HTMLURL string
}

Nombres cortos para alcances cortos

El estilo Go favorece la brevedad con igual claridad en ámbitos limitados:

Go
// idiomatic
for i, v := range items { ... }
for k, v := range m { ... }

if err := f(); err != nil { ... }

func (s *Server) Serve(w http.ResponseWriter, r *http.Request) { ... }

Convenciones establecidas:

  • i, j, k para índices de bucle.
  • v para valores, k para claves.
  • r para *Request/io.Reader, w para Writer/ResponseWriter.
  • err para errores.
  • CÓDIGOPH10 para CÓDIGOPH11.
  • Receptores de métodos: 1 o 2 letras consistentes en todo el tipo (v2, v3). Nunca v4 o v5.

Cuanto más amplio sea el alcance, más descriptivo debe ser el nombre: un count local está bien, pero una variable Count exportada debería indicarle lo que cuenta.

Sin prefijo "I" en las interfaces, sin sufijo "Impl"

Go
// idiomatic
type Reader interface { ... }
type fileReader struct { ... } // concrete implementation

// not idiomatic
type IReader interface { ... }
type ReaderImpl struct { ... }

Las interfaces pequeñas suelen tener el sufijo -er: Reader, Writer, Stringer, Closer. Se hace eco del hecho de que describen un comportamiento (idealmente, un método único).

Nombres de paquetes

Un paquete tiene un solo nombre, corto, todo en minúsculas, sin guiones bajos:

  • ✅ CÓDIGOPH0, CÓDIGOPH1, CÓDIGOPH2, CÓDIGOPH3
  • ❌ CÓDIGOPH4, CÓDIGOPH5, CÓDIGOPH6

El nombre del paquete es el prefijo de uso de sus símbolos: bytes.Buffer, http.Client. Entonces user.User es redundante: es mejor cambiar el nombre del tipo (user.Account) o del paquete.

gofmt no está sujeto a debate

gofmt hace cumplir:

  • Sangría con pestañas (no espacios).
  • Llave { en la misma línea que la firma.
  • Importaciones en grupos separados por una línea en blanco; goimports también agrega importaciones faltantes.
  • Espacios alrededor de los operadores.

Ejecute siempre antes de comprometerse:

Bash
go fmt ./...
goimports -w .
go vet ./...

Los linters (staticcheck, golangci-lint) añaden reglas adicionales (variables no utilizadas, sombreado, comparaciones inútiles, ...).

Ejercicios

Ejercicio#go.m10.l1.e1
Intentos: 0Cargando...

Rinomina la estructura Http_Client en HTTPClient (y el campo Url en URL) siguiendo las convenciones Go sugli acronimi.

Cargando editor...

Solución disponible después de 3 intentos

Ejercicio#go.m10.l1.e2
Intentos: 0Cargando...

Invertir la visibilidad: mostrar el nombre de usuario ingresado (maiuscolo) y la contraseña privada (minuscolo).

Cargando editor...

Solución disponible después de 3 intentos

Cuestionario#go.m10.l1.e3
Listo

¿Cuáles son los nombres idiomáticos de Go per un tipo de deporte 'servidor HTTP'?

Go
type ??? struct {}
Opciones de respuesta