Experimentos de Go: qué son, cómo funcionan y lista actual

Fuentes: Go Experiments Explained: Lifecycle, Patterns, and Current Status
Imagen generada por IA con el prompt: Dark terminal screen with Go source code highlighting GOEXPERIMENT flags and version numbers, soft glow of text, gopher mascot silhouette in background, clean technical editorial style
Imagen generada con IA

Los experimentos de Go son funcionalidades que el equipo de Go incorpora en sus lanzamientos para obtener retroalimentación real antes de consolidarlas. Pueden presentarse como paquetes nuevos en la biblioteca estándar, cambios en el compilador o el runtime, e incluso modificaciones de comportamiento que rompen la compatibilidad.

El ciclo de vida más habitual sigue un patrón reconocible: el experimento se publica desactivado por defecto y se activa de forma explícita mediante la variable de entorno GOEXPERIMENT; si la experiencia es positiva, una o dos versiones después se finaliza y pasa a estar activo por defecto, a veces con un periodo de gracia para conservar el comportamiento antiguo. El nuevo colector de basura introducido de forma experimental en Go 1.25 y activado por defecto en Go 1.26 es un ejemplo de este recorrido. También puede ocurrir que el equipo, cuando tiene confianza suficiente, lance el cambio directamente como disponible de forma general, manteniendo una ventana de transición, como sucedió con las Swiss Tables en Go 1.24.

El artículo distingue además los "experimentos permanentes": funciones que permanecen desactivadas por defecto sin expectativa de graduarse, orientadas a usos especializados, como el diagnóstico de seguimiento de campos de estructuras o el ranking estático de bloqueos.

El autor advierte de que no existe una página oficial que liste los experimentos y su estado; para conocerlos hay que consultar go doc goexperiment.Flags, revisar src/internal/buildcfg/exp.go o cruzar los nombres con las notas de cada versión y los issues de GitHub.

A fecha de Go 1.26, los experimentos permanentes disponibles son FieldTrack, StaticLockRanking, CgoCheck2, BoringCrypto, PreemptibleLoops y HeapMinimum512KiB, este último pensado para entornos con recursos limitados. Entre los desactivados por defecto figuran Arenas (memory arenas en pausa por la reacción negativa de la comunidad), NewInliner (nueva lógica de inlining en evaluación desde Go 1.22), JSONv2 (reemplazo mejorado de encoding/json), RuntimeSecret (funciones para borrar memoria en Linux amd64 y arm64), GoroutineLeakProfile (perfil pprof para detectar goroutines filtradas) y SIMD (acceso a operaciones SIMD específicas de la arquitectura).