ProgramaciónDesarrollador Go Middle/Lead

¿Cuáles son las características del trabajo con paquetes y la visibilidad en Go? ¿Cuándo y cómo se deben usar los objetos exportados y no exportados?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Go, el ámbito de las variables, funciones, estructuras y métodos está estrechamente relacionado con el registro de la primera letra:

  • Si el nombre comienza con letra mayúscula — el objeto se exporta fuera del paquete.
  • Si el nombre comienza con letra minúscula — el objeto solo está disponible dentro de su paquete.

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:

  • Ocultar los detalles de implementación, exportar solo los tipos y funciones necesarias.
  • Usar nombres en minúsculas para constantes/funciones privadas.

Pregunta capciosa

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

Ejemplos de errores reales de la práctica


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.