Categorygithub.com/gabrielrodriguesleite/go
repository
0.0.0-20240711121513-ddce963970e8
Repository: https://github.com/gabrielrodriguesleite/go.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

GO

Repositorio sobre o estudo de Go Lang

Instalação

Baixar a última versão: https://go.dev/dl/go1.18.4.linux-amd64.tar.gz

Remover instalações prévias da pasta /usr/local/go

sudo rm -rf /usr/local/go

Descompactar o arquivo baixado em /usr/local

sudo tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz

Importante Não descompactar o arquivo dentro de uma instalação existente!

Incluir /usr/local/go/bin no ambiente PATH (apenas 1 opção)

  1. Para uma instalação por usuário incluir no arquivo* $HOME/.profile:
  2. Para uma instalação no sistema incluir no arquivo /etc/profile

export PATH=$PATH:/usr/local/go/bin

Essa mudança só será aplicada depois do login ou por rodar o comando

source $HOME/.profile

*(Nota) Se estiver utilizando zsh o arquivo $HOME/.zshrc também precisa receber o comando export PATH=$PATH:/usr/local/go/bin

Para verificar a instalação:

go version

A versão instalada deve aparecer ex:

go version go1.18.4 linux/amd64

O comando go env mostra as variaveis de ambiente definidas.

Referências

https://go.dev/doc/install


Hello World em Go

~/helloworld.go

package main // define o escopo da aplicação ajudando na separação de responsabilidade
import "fmt" // a biblioteca padrão que trás diversas facilidades

func main() { // define uma nova função 
	fmt.Println("Hello World") // utiliza um método da biblioteca padrão para imprimir a mensagem na tela

  // Mais sobre a biblioteca padrão em:
  // https://pkg.go.dev/fmt
}

O comando go run helloworld.go irá executar o arquivo.

Deve exibir Hello World na saída padrão.


Compilando com build

Para compilarmos o pacote utilizamos go build helloworld.go

Com isso é criado um novo arquivo executável para a arquitetura atual.

Para executar o arquivo recém criado no linux usamos o comando ./helloworld

A mensagem Hello World deve ser exibida na saída padrão.

Para compilarmos para outra arquitetura podemos definir a variável de ambiente GOOS

GOOS=linux go build helloworld.go

GOOS=windows ARCH=386 go build helloworld.go

GOOS=darwin go build helloworld.go

Para exibir uma lista completa use go tool dist list

Para exibir uma ajuda sobre o comando build use go help build


Variaveis

// vaiáveis declaradas e atribuídas em qualquer contexto
var x int
x = 256
var y, z string = "Olá", "Mundo"

func main() {
  w := 16 // para atribuir durante a declaração é necessário estar dentro do escopo da função
}

./02-Variaveis/variaveis.go

//...
a := true       // bool
b := 64         // int
c := 3.14       // float64
d := 'A'        // int32
e := "Palavra"  // string
f := `
  Um parágrafo
definido durante
a declaração e com
o tipo inferido pelo
valor.
`               // string

// outros tipos estão disponíveis mas esses são os mais comuns

// vamos descobrir os tipos
fmt.Println("\n VARIÁVEIS EM GO")
fmt.Printf("O tipo de 'a' é %T e tem o valor de: %v\n",a,a)
fmt.Printf("O tipo de 'b' é %T e tem o valor de: %v\n",b,b)
fmt.Printf("O tipo de 'c' é %T e tem o valor de: %v\n",c,c)
fmt.Printf("O tipo de 'd' é %T e tem o valor de: %v\n",d,d)
fmt.Printf("O tipo de 'e' é %T e tem o valor de: %v\n",e,e)
fmt.Printf("O tipo de 'f' é %T e tem o valor de: %v\n",f,f)
//...

Constantes são definidas no escopo da função usando apenas "=" ao invés de ":=" ou utilizando const

const b int = 8
const s strint = "let's go"
const (
  pi = 3.14
  c int = 25
)

Go mod e Go work - Módulos e Espaço de trabalho

Por padrão nossos projetos precisam ficar dentro da pasta $HOME/go/src para que possamos acessar um pacote dentro de outro arquivo.

Porém para podermos criar e manter projetos complexos precisamos ter uma maior flexibilidade com respeito a árvore de arquivos do nosso projeto.

Para isso existe o Go mod.

Dentro da pasta que desejamos trabalhar nosso módulo executamos go mod init nome_do_modulo

Um arquivo go.mod será criado, esse arquivo define nosso modulo e indica a versão do go utilizada no momento da criação, também registra as dependências do módulo.

Depois de instalarmos alguma dependência com o go get nome_do_pacote além do registro no go.mod ser atualizado também é criado um arquivo go.sum que serve pra travar a versão da dependência.

Dicas O comando go mod tidy faz uma verificação e remove dependências não utilizadas também como instala dependências que estão faltando.

O comando go mod graph mostra todas as dependências do projeto.

O comando go mod vendor cria uma pasta e inclui as dependências junto ao projeto.

O comando go install é o comando correto para instalar binários.

Considere o seguinte exemplo:

./main.go

./exemplo/exemplo.go

# Definir um go.mod partir da pasta do módulo
cd exemplo
go mod init exemplo

# Definir um go.work (workspace) ou seja um arquivo com as dependencias locais
cd ../
go work init
go work use exemplo
go run main.go

./main.go

./go.work

./exemplo/exemplo.go

./exemplo/go.mod

O arquivo go.work criado na raiz do projeto indica o caminho dos módulos usados pelo nosso pacote main.

Referências

https://go.dev/doc/tutorial/workspaces https://github.com/golang/tools/blob/master/gopls/doc/workspace.md


Escopo e visibilidade

O escopo em Go é bem definido.

Declarações globais, feitas fora de uma função, podem ser acessadas dentro do pacote.

Funções declaradas dentro de um pacote estarão visiveis a outros pacotes se forem declaradas começando com a letra maiúscula.

Nomes de funções começados com letras minusculas são visiveis apenas dentro do mesmo pacote.

O mesmo se aplica para os atributos de uma struct.

./04-Escopo/pacote/pacote.go

package pacote

func Imprimir() {

}

./04-Escopo/main.go

package main

import "pacote"

func main() {
  pacote.Imprimir()
}

A função Imprimir só estará disponível pois inicia com 'I' maiúsculo.

Go by example

Exercícios sobre diversos pacotes embutidos resolvendo tarefas comuns estão na pasta:

Exercicios/GoByExample
Referências

https://gobyexample.com/

Aprendendo Go com testes

Exercício de teste onde a linguagem é explicada por meio de testes estão na pasta:

Exercicios/GoComTestes
Referências

https://larien.gitbook.io/aprenda-go-com-testes/


Dicas úteis:

Para quem está acostumado a desenvolver API com node utilizando nodemon para auxiliar nos carregamentos automatizados aí vai a dica:

  1. Instale nodemon no sistema (dependência: npm): npm i -g nodemon
  2. Rode a aplicação go utilizando nodemon com nodemon --exec "go run main.go" --signal SIGTERM
  3. Bônus: para facilitar é possível usar tanto Makefile quanto package.json script para o passo 2.