Importaciones y paquetes en Go (Golang)

in #cervantes6 years ago (edited)

gopher wallpaper

Hace un par de días un amigo decidió comenzar a aprender Go y, como no podía dejar pasar la oportunidad, decidí ayudarlo a comenzar; les comparto esto porque me hizo notar que hay algunos detalles que he dejado fuera en mis publicaciones anteriores y que quizás les han generado dudas, como las que le surgieron mi amigo.

Importaciones y paquetes

Desde los primeros ejercicios deben haber notado que la primera linea de código del archivo es package main, si vieron la publicación de introducción deberían saber que el nombre no es arbitrario, sin embargo, este no es el único paquete que puede tener un programa en Go, el hecho es que todo archivo con extensión *.go debe pertenecer a un paquete y estos paquetes pueden recibir el nombre que deseen, aunque hay ciertas recomendaciones que deberían seguir, por ejemplo:

  • Colocar cada paquete en un carpeta separada.
  • Usar nombres cortos y en minúsculas para los paquetes.
  • Usar el mismo nombre de la carpeta que lo contiene.

Importaciones

Las importaciones y los paquetes están bastante relacionados, porque es a través de los paquetes que realizamos las importaciones, para ilustrar esto les mostraré el código de un pequeño programa.

// Archivo main.go
// Este es un simple servidor web
package main // Nombre del paquete

import "fmt" // Importación individual

import ( // Importación múltiple
    "log"
    "net/http"
    "time"
)

const PORT = "8080"

func main() {
    mux := http.NewServeMux() // Manejador de peticiones
    mux.HandleFunc("/", home)
    mux.HandleFunc("/time", getTime)
    log.Printf("Sirviendo aplicación en http://localhost:%s\n", PORT)
    log.Fatal(http.ListenAndServe(":"+PORT, mux)) // Levantando servidor
}

func home(w http.ResponseWriter, r *http.Request) { // Una función manejadora
    fmt.Fprintf(w, "Hola desde HOME")
}

func getTime(w http.ResponseWriter, r *http.Request) {
    horas, minutos, segundos := time.Now().Clock()
    fmt.Fprintf(w, "Son las %d:%d:%d", horas, minutos, segundos)
}



No se preocupen si aún no entienden este programa, aunque con los comentarios podrían hacerse una idea, pero el objetivo actual es entender como funcionan las importaciones. Coloqué comentarios al inicio del archivo para probar que no es obligatorio que la declaración del paquete se encuentre en la primera línea del programa, de hecho es que es común encontrar comentarios documentando el programa al inicio del archivo, sin embargo, la declaración del paquete debe encontrarse antes de cualquier sentencia u obtendrán un error en tiempo de compilación, no duden en comprobarlo.

Como pueden ver, es posible importar paquetes individualmente, como en grupo. Si se va a importar más de un paquete, que es lo normal, lo más recomendable es realizar todas las importaciones utilizando la notación grupal con los paréntesis. En este caso se realiza la importación del ya conocido paquete fmt por separado solo con fines didácticos.

Anteriormente hemos realizado impresiones por consola haciendo uso de algunas funciones del paquete fmt, así que no debería sorprenderlos el hecho de que se utilice la notación de punto para acceder a variables y funciones pertenecientes a al paquete, como en el caso de http.NewServeMux(). Otra cosa relevante que no recuerdo haber mencionando es que las funciones y variables dentro de un paquete pueden ser publicas (denominadas exportadas) o privadas (denominadas no exportadas) y esto se determina según el identificador con el que las nombren, si el nombre comienza con mayúsculas, significa que puede ser exportado, si no lo es, entonces es no exportado. Por esa razón, los nombres de variables y funciones a las que accedemos a través de los paquetes comienzan con letra mayúscula.

Si vamos específicamente el caso del paquete net/http, pueden notar que el paquete http, se encuentra dentro del fichero/paquete net, sin embargo, para acceder a él basta con referirnos sólo al nombre del paquetes, es decir, el último que se muestra en la ruta (http, en este caso).

Paquetes

Es una buena práctica separar de manera lógica las partes de un programa, para esto existen algunos patrones y recomendaciones en los que no vamos a profundizar, pero el caso es que Go nos permite tener múltiples archivos dentro de un mismo paquete y acceder a su contenido desde otro archivo como si todo se encontrara en uno solo. Por ejemplo, si colocáramos las funciones del ejemplo en un archivo separado perteneciente al mismo paquete, el programa seguiría funcionando. Permitan que lo demuestre.

// Archivo main.go
package main

import (
    "log"
    "net/http"
)

const PORT = "8080"

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", home)
    mux.HandleFunc("/time", getTime)
    log.Printf("Sirviendo aplicación en http://localhost:%s\n", PORT)
    log.Fatal(http.ListenAndServe(":"+PORT, mux))
}


// Archivo handler.go
package main

import (
    "fmt"
    "net/http"
    "time"
)

func home(w http.ResponseWriter, r *http.Request) { // Una función manejadora
    fmt.Fprintf(w, "Hola desde HOME")
}

func getTime(w http.ResponseWriter, r *http.Request) {
    horas, minutos, segundos := time.Now().Clock()
    fmt.Fprintf(w, "Son las %d:%d:%d", horas, minutos, segundos)
}



No les voy a pedir que confíen en mí, es muy probable que cometiera algún error, así que los invito a realizar pruebas por su cuenta y comentar cualquier duda o incluso alguna corrección. Simplemnte pegen el codigo en un archivo con extensión .go, ejecútenlo (go run <nombre>.go) y visiten localhost:8080 y localhost:8080/time desde su navegador favorito. Escogí este programa como un pequeño adelanto de lo que pienso compartir con ustedes tan pronto como cubra los aspectos esenciales del lenguajes, espero que les cause tanta emoción como a mí.

separator.png

Publicaciones relacionadas

  1. De Python a Go (Golang)

  2. Introducción al lenguaje de programación Go (Golang)

  3. Estructuras de control de flujo en Go

  4. Array y Slice en Go (Golang)

  5. Maps en Go (Golang)

  6. Punteros en Go (Golang)

Gracias por leer, espero que este artículo te resultara de provecho. Si así fue, no dudes en dejar un comentario, compartirlo y votar. Te invito a comentar cualquier duda o sugerencia, te aseguro que las leo todas. Así que, por favor, ayúdame a mejorar y continuar compartiendo contenido de calidad. Si te gusta la programación y/o la informática en general, te invito a formar parte de la comunidad Develop Spanish dónde compartimos contenido de esa naturaleza y totalmente en español. Hasta la próxima.

banner-steemit.jpg

Sort:  

Hello! Your post has been resteemed and upvoted by @ilovecoding because we love coding! Keep up good work! Consider upvoting this comment to support the @ilovecoding and increase your future rewards! ^_^ Steem On!

Reply !stop to disable the comment. Thanks!

Este post fue votado por la comunidad y trail @developspanish, comunidad encargada de curar a los programadores, traductores de software y bloggers de informática y tecnología de habla hispana.

¿Quieres recibir mejores recompensas en tus post de informática, tecnología o programación, ayúdanos delegando algo de SP:
1 SP, 5 SP, 10 SP