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.
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
type APIResponse struct {
UserID int
HTMLURL string
}Nombres cortos para alcances cortos
El estilo Go favorece la brevedad con igual claridad en ámbitos limitados:
// 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, kpara índices de bucle.vpara valores,kpara claves.rpara*Request/io.Reader,wparaWriter/ResponseWriter.errpara errores.- CÓDIGOPH10 para CÓDIGOPH11.
- Receptores de métodos: 1 o 2 letras consistentes en todo el tipo (
v2,v3). Nuncav4 ov5.
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"
// 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;
goimportstambién agrega importaciones faltantes. - Espacios alrededor de los operadores.
Ejecute siempre antes de comprometerse:
go fmt ./...
goimports -w .
go vet ./...Los linters (staticcheck, golangci-lint) añaden reglas adicionales (variables no utilizadas, sombreado, comparaciones inútiles, ...).
Ejercicios
Rinomina la estructura Http_Client en HTTPClient (y el campo Url en URL) siguiendo las convenciones Go sugli acronimi.
Solución disponible después de 3 intentos
Invertir la visibilidad: mostrar el nombre de usuario ingresado (maiuscolo) y la contraseña privada (minuscolo).
Solución disponible después de 3 intentos
¿Cuáles son los nombres idiomáticos de Go per un tipo de deporte 'servidor HTTP'?
type ??? struct {}