En Go, el ámbito de las variables, funciones, estructuras y métodos está estrechamente relacionado con el registro de la primera letra:
Archivo example.go:
package mypkg var ExportedVar int // disponible en otros paquetes var unexportedVar int // solo en mypkg
Al importar un paquete, solo se pueden acceder a los objetos exportados.
Mejor práctica:
Pregunta: "¿Se puede exportar una estructura con campos no exportados? ¿Qué pasará si se intenta usar esos campos en otro paquete?"
Respuesta: Solo se exporta la estructura con letra mayúscula. Todos los campos de la estructura que comienzan con letra minúscula no estarán disponibles fuera del paquete. Intentar acceder a esos campos desde fuera generará un error de compilación.
Ejemplo:
// package user type User struct { Name string // Campo exportado age int // No disponible fuera del paquete user }
En otro paquete:
u := user.User{Name: "Ivan"} u.age = 42 // Error de compilación: age is not accessible
Historia
Pérdida de datos al realizar marshaling en json: En la API REST se exportó la estructura, pero se hicieron los campos no exportados (con letras minúsculas). Como resultado, el marshal en JSON no incluía esos campos, y los usuarios de la API no recibían la información necesaria.
Historia
No funcionan los accesos a funciones necesarias: El equipo movió utilidades útiles a un paquete separado, olvidando hacer sus nombres con letra mayúscula. Las funciones quedaron inaccesibles y fue necesario rehacer las interfaces.
Historia
Colisión de nombres al autogenerar código: Al generar código en un paquete, se utilizaron variables con nombres idénticos, diferenciándose por el registro de la letra. Uno de los scripts accidentalmente renombró una constante exportada a un nombre en minúscula. Como resultado, la aplicación perdió acceso global a esa constante, y parte de la funcionalidad se volvió inaccesible.