Lecciones del módulo (5/5)
Restricciones y etiquetas de compilación
Las restricciones de compilación (también llamadas etiquetas de compilación) controlan la compilación de un archivo según el sistema operativo, la arquitectura, la versión de Go o las etiquetas personalizadas pasadas en la línea de comando. Se utilizan para código multiplataforma, archivos de prueba pesados y escenarios similares.
Sintaxis moderna: //go:build
Desde Go 1.17+, el formato canónico es el comentario especial //go:build, colocado en la parte superior del archivo antes de package, en una línea aparte, seguido de una línea en blanco:
//go:build linux
package main
// this file is built ONLY on LinuxTres reglas absolutas:
- El comentario debe aparecer antes de
package. - Debe ir seguido de una línea en blanco.
- No hay espacio entre
//ygo:build(es un disparador sintáctico, no un comentario cualquiera).
Expresiones booleanas
La expresión después de //go:build acepta operadores lógicos:
//go:build linux && amd64 // both conditions
//go:build linux || darwin // any one (Unix-like)
//go:build !windows // negation
//go:build (linux || darwin) && !arm64
//go:build go1.22 // Go version ≥ 1.22
//go:build integration // custom tag (see below)Las etiquetas integradas más comunes:
- SO: CÓDIGOPH0, CÓDIGO1, CÓDIGO2, CÓDIGO3, CÓDIGO4...
- Arquitectura:
amd64,arm64,386,wasm... - Ir a la versión:
go1.20,darwin0... (verdadero si la versión es ≥). darwin1: verdadero si cgo está habilitado.
Multiplataforma: convención de nombre de archivo
Más allá de las etiquetas explícitas, Go reconoce sufijos de nombres de archivos como restricciones de compilación implícitas:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Es el patrón idiomático para implementaciones dependientes de la plataforma de la misma interfaz (cada archivo define las mismas funciones con código diferente).
Etiquetas personalizadas: optar por pruebas intensas
Las etiquetas personalizadas son cualquier identificador que pasas en la línea de comando:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandEjecución:
go test -tags=integration ./...Sin -tags=integration, el archivo es invisible para el compilador (las pruebas que contiene no existen para go test). Es la forma canónica de separar las pruebas unitarias (siempre) de las pruebas de integración (bajo demanda, tal vez solo en CI).
Sintaxis antigua: // +build (en desuso)
Antes de la versión 1.17, el formato era // +build linux (tenga en cuenta el espacio y que es +build, no go:build). Todavía es compatible por compatibilidad con versiones anteriores, pero gofmt en Go 1.17+ agrega ambos cuando solo encuentra el anterior:
//go:build linux
// +build linux
package mainPara archivos nuevos, utilice únicamente el formulario //go:build moderno.
Ejercicios
En la parte superior del archivo agregue la restricción de compilación que lo compila SÓLO en Linux. Recuerde la línea en blanco antes del paquete.
Mostrar pista
El comentario //go:build va ANTES del paquete, en una línea aparte, seguido de una línea en blanco.
Solución disponible después de 3 intentos
Agregue una restricción de compilación que EXCLUYA Windows (¡use el operador de negación!).
Solución disponible después de 3 intentos
Para habilitar en el momento de la prueba una etiqueta de 'integración' personalizada declarada con //go:build Integration, ¿qué bandera utiliza?
$ go test -tags=???