Cómo escribir paquetes Go

Un paquete Go consta de archivos Go ubicados en el mismo directorio, al principio del cual existe la misma expresión de package . Los paquetes que se conectan a los programas le permiten ampliar sus capacidades. Algunos paquetes son parte de la biblioteca Go estándar. Esto significa que si usa Go, ya están instalados. Otros paquetes se instalan usando el comando go get . También puede escribir sus propios paquetes Go, crear archivos en directorios especiales y cumplir con las reglas de diseño de paquetes.



El material, cuya traducción publicamos hoy, es una guía para el desarrollo de paquetes Go que se pueden conectar a otros archivos.

Prerrequisitos


  • Configure su entorno de software Go (aprenda cómo hacer esto aquí ). Cree un espacio de trabajo Ir (el quinto punto del material anterior está dedicado a esto). En la siguiente sección de este material puede encontrar ejemplos que se recomienda reproducir en casa. Para que pueda lidiar mejor con ellos.
  • Para profundizar su conocimiento de GOPATH , eche un vistazo a este material.

Escribir e importar paquetes


Escribir el código del paquete es lo mismo que escribir el código Go normal. Los paquetes pueden contener declaraciones de funciones, tipos y variables, que luego se pueden utilizar en otros programas Go.

Antes de que podamos comenzar a crear un nuevo paquete, debemos ir al espacio de trabajo Ir. Se encuentra en la ruta especificada por la variable GOPATH . Por ejemplo, dejemos que nuestra organización se llame gopherguides . Al mismo tiempo, nosotros, como repositorio, usamos GitHub . Esto lleva al hecho de que, a lo largo de la ruta especificada por GOPATH , tenemos la siguiente estructura de carpetas:

 └── $GOPATH    └── src        └── github.com            └── gopherguides 

Saludaremos el nombre del paquete que desarrollaremos en esta guía. Para hacer esto, cree el directorio greet en el directorio gopherguides . Como resultado, la estructura de carpetas existente tomará la siguiente forma:

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet 

Ahora estamos listos para agregar el primer archivo al directorio de greet . Normalmente, un archivo que es el punto de entrada de un paquete se llama igual que el directorio del paquete. En este caso, esto significa que nosotros, en el directorio greet , creamos el archivo greet.go :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet                    └── greet.go 

En este archivo podemos escribir código que queremos reutilizar en nuestros proyectos. En este caso, crearemos la función Hello , que muestra el texto Hello, World! .

Abra el archivo greet.go en un editor de texto y agregue el siguiente código:

 package greet import "fmt" func Hello() {    fmt.Println("Hello, World!") } 

Analicemos el contenido de este archivo. La primera línea de cada archivo debe contener el nombre del paquete en el que trabajamos. Como estamos en el package greet , la palabra clave del package se usa aquí, seguida del nombre del paquete:

 package greet 

Esto le dice al compilador que acepte todo en el archivo como parte del paquete greet .

A continuación, los paquetes necesarios se importan utilizando la declaración de import . En este caso, solo necesitamos un paquete: fmt :

 import "fmt" 

Y finalmente, creamos la función Hello . Ella usará las capacidades del paquete fmt para mostrar la cadena Hello, World! :

 func Hello() {    fmt.Println("Hello, World!") } 

Ahora, después de crear el paquete de greet , puede usarlo en cualquier otro paquete. Creemos un nuevo paquete en el que usaremos el paquete greet .

A saber, crearemos un paquete de example . Para hacer esto, procederemos de los mismos supuestos de los que procedemos, creando el paquete de greet . Primero, cree la carpeta de example en la carpeta gopherguides :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                    └── example 

Ahora cree un archivo que sea el punto de entrada del paquete. Consideramos este paquete como un programa ejecutable, y no como un paquete cuyo código está planeado para usarse en otros paquetes. Los archivos que son los puntos de entrada de los programas generalmente se denominan main.go :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── example                    └── main.go 

Abra el archivo main.go en el editor y main.go siguiente código en él, lo que le permite usar las capacidades del paquete greet :

 package main import "github.com/gopherguides/greet" func main() {    greet.Hello() } 

Importamos el paquete greet en el archivo main.go , lo que significa que para llamar a la función declarada en este paquete, debemos usar la notación de puntos. Una notación de punto es una construcción en la que se coloca un punto entre el nombre del paquete y el nombre del recurso de este paquete que se utilizará. Por ejemplo, en el paquete greet , la función Hello desempeña el papel de un recurso. Si necesita llamar a esta función, se utiliza la notación de puntos : greet.Hello() .

Ahora puede abrir la terminal y ejecutar el programa:

 go run main.go 

Después de hacer esto, el terminal mostrará lo siguiente:

 Hello, World! 

Ahora hablemos sobre cómo usar variables declaradas en paquetes. Para hacer esto, agregue la declaración de variable al archivo greet.go :

 package greet import "fmt" var Shark = "Sammy" func Hello() {    fmt.Println("Hello, World!") } 

Abra el archivo main.go y agregue una línea donde se fmt.Println() función fmt.Println() para mostrar el valor de la variable Shark declarada en el paquete greet.go . A saber, traiga main.go al siguiente formulario:

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark) } 

Ejecute el programa nuevamente:

 go run main.go 

Ahora ella mostrará lo siguiente:

 Hello, World! Sammy 

Ahora hablemos sobre cómo declarar tipos en paquetes. Cree un tipo de Octopus con los campos Name y Color , y cree un método de tipo. Este método, cuando se llama, devolverá el contenido especialmente procesado de los campos Octopus . Traigamos greet.go a la siguiente forma:

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func Hello() {    fmt.Println("Hello, World!") } 

Ahora abra main.go , cree una instancia de la estructura del nuevo tipo en él y consulte su método String() :

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String()) } 

Después de crear una instancia de Octopus usando una construcción que se parece a oct := greet.Octopus , puede acceder a los métodos y propiedades del tipo desde el main.go archivo main.go Esto, en particular, le permite usar el oct.String() ubicado al final del archivo main.go sin recurrir a greet . Además, podemos, por ejemplo, referirnos al campo de la estructura de Color usando la construcción oct.Color . Al mismo tiempo, nosotros, como cuando llamamos al método, no accedemos a greet .

El método String del tipo Octopus usa la función fmt.Sprintf para formar la oración y devuelve, usando return , el resultado, la cadena, a la llamada al método (en este caso, este lugar está en main.go ).

Ejecute el programa nuevamente:

 go run main.go 

Producirá lo siguiente en la consola:

 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange. 

Ahora que hemos equipado Octopus con el método String , tenemos un mecanismo de salida de información de tipo adecuado para su reutilización. Si en el futuro necesita cambiar el comportamiento de este método, que puede usarse en muchos proyectos, será suficiente editar su código en greet.go .

Exportación de entidad


Es posible que haya notado que todo lo que trabajamos al referirnos al paquete de greet tiene nombres que comienzan con una letra mayúscula. Go no tiene modificadores de acceso como public , private o protected , que están en otros idiomas. La visibilidad de las entidades para los mecanismos externos está controlada por el hecho de que las letras, con una letra grande o pequeña, comienzan con sus nombres. Como resultado, los tipos, variables, funciones cuyos nombres comienzan con una letra mayúscula están disponibles fuera del paquete actual. El código que está visible fuera del paquete se llama exportado.

Si equipa el tipo Octopus con un nuevo método llamado reset , entonces este método puede llamarse desde el paquete greet , pero no desde el archivo main.go , que está fuera del paquete greet . Aquí hay una versión actualizada de greet.go :

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 

Intentemos llamar a reset desde el archivo main.go :

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.reset() } 

Esto dará como resultado el siguiente error de compilación:

 oct.reset undefined (cannot refer to unexported field or method greet.Octopus.reset) 

Para exportar el método de reset tipo Octopus , debe cambiarle el nombre, reemplazando la primera letra, minúscula r , con R mayúscula R Hacemos esto editando greet.go :

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) Reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 

Esto llevará al hecho de que podremos llamar a Reset desde otros paquetes y sin encontrar mensajes de error:

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.Reset()    fmt.Println(oct.String()) } 

Ejecute el programa:

 go run main.go 

Esto es lo que llega a la consola:

 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange The octopus's name is "" and is the color . 

Al llamar al método Reset , borramos los campos Name y Color de nuestra instancia de Octopus . Como resultado, cuando se llama a String , donde se mostraba anteriormente el contenido de los campos Name y Color , ahora no se muestra nada.

Resumen


Escribir paquetes Go no es diferente a escribir código Go regular. Sin embargo, colocar el código del paquete en sus propios directorios permite aislar el código, que puede usarse en cualquier otro proyecto Go. Aquí hablamos sobre cómo declarar funciones, variables y tipos en paquetes, examinamos cómo usar estas entidades fuera de los paquetes y descubrimos dónde almacenar paquetes diseñados para su uso repetido.

Estimados lectores! ¿Qué programas sueles escribir en Go? ¿Usas paquetes propietarios en ellos?

Source: https://habr.com/ru/post/464289/


All Articles