Um pacote Go consiste em arquivos Go localizados no mesmo diretĂłrio, no inĂcio dos quais existe a mesma expressĂŁo de
package
. Pacotes que se conectam a programas permitem expandir seus recursos. Alguns pacotes fazem parte da biblioteca Go padrão. Isso significa que, se você usar o Go, eles já estarão instalados. Outros pacotes são instalados usando o comando
go get
. Você também pode escrever seus próprios pacotes Go, criando arquivos em diretórios especiais e aderindo às regras de design de pacotes.

O material, cuja tradução publicamos hoje, é um guia para o desenvolvimento de pacotes Go que podem ser conectados a outros arquivos.
Pré-requisitos
- Configure o seu ambiente de software Go (saiba como fazer isso aqui ). Crie uma área de trabalho Ir (o quinto ponto do material acima é dedicado a isso). Na próxima seção deste material, você encontrará exemplos que são recomendados para serem reproduzidos em casa. Então você pode lidar melhor com eles.
- Para aprofundar o seu conhecimento da
GOPATH
- dĂŞ uma olhada neste material.
Escrevendo e importando pacotes
Escrever código de pacote é o mesmo que escrever código Go normal. Os pacotes podem conter declarações de funções, tipos e variáveis, que podem ser usados ​​em outros programas Go.
Antes de começarmos a criar um novo pacote, precisamos ir para o espaço de trabalho Ir. Está localizado no caminho especificado pela variável
GOPATH
. Por exemplo, deixe nossa organização ser chamada de
gopherguides
. Ao mesmo tempo, nĂłs, como repositĂłrio, usamos o
GitHub
. Isso leva ao fato de que, ao longo do caminho especificado por
GOPATH
, temos a seguinte estrutura de pastas:
└── $GOPATH └── src └── github.com └── gopherguides
Vamos nomear o pacote que iremos desenvolver neste guia,
greet
. Para fazer isso, crie o diretĂłrio
greet
no diretĂłrio
gopherguides
. Como resultado, a estrutura de pastas existente assumirá o seguinte formato:
└── $GOPATH └── src └── github.com └── gopherguides └── greet
Agora estamos prontos para adicionar o primeiro arquivo ao diretĂłrio
greet
. Normalmente, um arquivo que Ă© o ponto de entrada de um pacote Ă© chamado da mesma maneira que o diretĂłrio do pacote. Nesse caso, isso significa que nĂłs, no diretĂłrio
greet
, criamos o arquivo
greet.go
:
└── $GOPATH └── src └── github.com └── gopherguides └── greet └── greet.go
Nesse arquivo, podemos escrever o código que queremos reutilizar em nossos projetos. Nesse caso, criaremos a função
Hello
, que exibe o texto
Hello, World!
.
Abra o arquivo
greet.go
em um editor de texto e adicione o seguinte cĂłdigo:
package greet import "fmt" func Hello() { fmt.Println("Hello, World!") }
Vamos analisar o conteĂşdo deste arquivo. A primeira linha de cada arquivo deve conter o nome do pacote em que trabalhamos. Como estamos no
package
greet
, a palavra-chave
package
Ă© usada aqui, seguida pelo nome do pacote:
package greet
Isso diz ao compilador para aceitar tudo no arquivo como parte do pacote
greet
.
Em seguida, os pacotes necessários são importados usando a instrução de
import
. Nesse caso, precisamos apenas de um pacote -
fmt
:
import "fmt"
E, finalmente, criamos a função
Hello
. Ela usará os recursos do pacote
fmt
para exibir a sequĂŞncia
Hello, World!
:
func Hello() { fmt.Println("Hello, World!") }
Agora, após a criação do pacote
greet
, você pode usá-lo em qualquer outro pacote. Vamos criar um novo pacote no qual usaremos o pacote
greet
.
Nomeadamente, criaremos um pacote de
example
. Para fazer isso, procederemos das mesmas suposições das quais procedemos, criando o pacote
greet
. Primeiro, crie a pasta de
example
na pasta
gopherguides
:
└── $GOPATH └── src └── github.com └── gopherguides └── example
Agora crie um arquivo que é o ponto de entrada do pacote. Consideramos esse pacote como um programa executável, e não como um pacote cujo código está planejado para ser usado em outros pacotes. Os arquivos que são os pontos de entrada dos programas geralmente são chamados
main.go
:
└── $GOPATH └── src └── github.com └── gopherguides └── example └── main.go
Abra o arquivo
main.go
no editor e
main.go
cĂłdigo
main.go
seguir, o que permite tirar proveito do pacote
greet
:
package main import "github.com/gopherguides/greet" func main() { greet.Hello() }
NĂłs importamos o pacote
greet
no arquivo
main.go
, o que significa que, para chamar a função declarada neste pacote, precisamos usar a notação de ponto. Uma notação de ponto é uma construção na qual um ponto é colocado entre o nome do pacote e o nome do recurso deste pacote a ser usado. Por exemplo, no pacote
greet
, a função
Hello
desempenha o papel de um recurso. Se você precisar chamar essa função, a notação de ponto será usada
: greet.Hello()
.
Agora vocĂŞ pode abrir o terminal e executar o programa:
go run main.go
Depois de fazer isso, o terminal exibirá o seguinte:
Hello, World!
Agora vamos falar sobre como usar variáveis ​​declaradas em pacotes. Para fazer isso, adicione a declaração da variável ao arquivo
greet.go
:
package greet import "fmt" var Shark = "Sammy" func Hello() { fmt.Println("Hello, World!") }
Abra o arquivo
main.go
e adicione uma linha onde a função
fmt.Println()
é usada para exibir o valor da variável
Shark
declarada no pacote
greet.go
. Ou seja, traga
main.go
para o seguinte formato:
package main import ( "fmt" "github.com/gopherguides/greet" ) func main() { greet.Hello() fmt.Println(greet.Shark) }
Execute o programa novamente:
go run main.go
Agora ela exibirá o seguinte:
Hello, World! Sammy
Agora vamos falar sobre como declarar tipos em pacotes. Crie um tipo de
Octopus
com os campos
Name
e
Color
e crie um método de tipo. Este método, quando chamado, retornará o conteúdo especialmente processado dos campos
Octopus
. Vamos
greet.go
para o seguinte formulário:
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!") }
Agora abra o
main.go
, crie uma instância da estrutura do novo tipo e consulte o 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()) }
Depois de criar uma instância do
Octopus
usando uma construção parecida com
oct := greet.Octopus
, você pode acessar os métodos e propriedades do tipo no
main.go
para
main.go
arquivo
main.go
Isso, em particular, permite que vocĂŞ use o comando
oct.String()
localizado no final do arquivo
main.go
sem recorrer ao
greet
. Além disso, podemos, por exemplo, consultar o campo da estrutura
Color
usando a construção
oct.Color
. Ao mesmo tempo, nós, como quando chamamos o método, não acessamos
greet
.
O método
String
do tipo
Octopus
usa a função
fmt.Sprintf
para formar a sentença e retorna, usando
return
, o resultado, a string, para a chamada do método (nesse caso, este local está em
main.go
).
Execute o programa novamente:
go run main.go
Ele produzirá o seguinte para o console:
Hello, World! Sammy The octopus's name is "Jesse" and is the color orange.
Agora que equipamos o Octopus com o método
String
, temos um mecanismo de saĂda de informações de tipo adequado para reutilização. Se, no futuro, vocĂŞ precisar alterar o comportamento desse mĂ©todo, que pode ser usado em muitos projetos, será suficiente editar seu cĂłdigo em
greet.go
.
Exportação de Entidades
VocĂŞ deve ter notado que tudo com que trabalhamos ao acessar o pacote
greet
tem nomes que começam com uma letra maiúscula. O Go não possui modificadores de acesso, como
public
,
private
ou
protected
, que estĂŁo em outros idiomas. A visibilidade das entidades para mecanismos externos Ă© controlada pelo fato de com que letra, com uma letra pequena ou grande, começam seus nomes. Como resultado, tipos, variáveis, funções cujos nomes começam com uma letra maiĂşscula estĂŁo disponĂveis fora do pacote atual. O cĂłdigo visĂvel fora do pacote Ă© chamado de exportado.
Se vocĂŞ equipar o tipo
Octopus
com um novo método chamado
reset
, esse método poderá ser chamado no pacote
greet
, mas nĂŁo no arquivo
main.go
, que está fora do pacote
greet
. Aqui está uma versão atualizada do
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!") }
Vamos tentar chamar
reset
do arquivo
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() }
Isso resultará no seguinte erro de compilação:
oct.reset undefined (cannot refer to unexported field or method greet.Octopus.reset)
Para exportar o método de
reset
tipo
Octopus
, é necessário renomeá-lo, substituindo a primeira letra minúscula
r
por maiĂşscula
R
Fazemos isso 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!") }
Isso levará ao fato de que poderemos chamar
Reset
de outros pacotes e sem encontrar mensagens de erro:
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()) }
Execute o programa:
go run main.go
Aqui está o que chega ao console:
Hello, World! Sammy The octopus's name is "Jesse" and is the color orange The octopus's name is "" and is the color .
Ao chamar o método
Reset
, limpamos os campos
Name
e
Color
da nossa instância
Octopus
. Como resultado, ao chamar
String
, onde o conteĂşdo dos campos
Name
e
Color
foram exibidos anteriormente, agora nada Ă© exibido.
Sumário
Escrever pacotes Go não é diferente de escrever código Go normal. No entanto, colocar o código do pacote em seus próprios diretórios permite isolar o código, que pode ser usado em qualquer outro projeto Go. Aqui conversamos sobre como declarar funções, variáveis ​​e tipos em pacotes, examinamos como usar essas entidades fora dos pacotes e descobrimos onde armazenar pacotes projetados para reutilização.
Caros leitores! Quais programas você costuma escrever no Go? Você usa pacotes proprietários neles?
