Saltar al contenido principal
eLearner.app
Módulo 9 · Lección 5 de 545/50 en el curso~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Tres reglas absolutas:

  1. El comentario debe aparecer antes de package.
  2. Debe ir seguido de una línea en blanco.
  3. No hay espacio entre // y go: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
//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:

Code
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
//go:build integration

package mypkg

// tests that need a real DB, run only on demand

Ejecución:

Bash
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
//go:build linux
// +build linux

package main

Para archivos nuevos, utilice únicamente el formulario //go:build moderno.

Ejercicios

Ejercicio#go.m9.l5.e1
Intentos: 0Cargando...

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.

Cargando editor...
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

Ejercicio#go.m9.l5.e2
Intentos: 0Cargando...

Agregue una restricción de compilación que EXCLUYA Windows (¡use el operador de negación!).

Cargando editor...

Solución disponible después de 3 intentos

Cuestionario#go.m9.l5.e3
Listo

Para habilitar en el momento de la prueba una etiqueta de 'integración' personalizada declarada con //go:build Integration, ¿qué bandera utiliza?

Go
$ go test -tags=???
Opciones de respuesta