PauloRB.dev

Desenvolvedor de Software

Primeiros Passos com Go: Criando uma Aplicação Interativa do Zero | PauloRB.dev Primeiros Passos com Go: Criando uma Aplicação Interativa do Zero - PauloRB.dev
Primeiros Passos com Go: Criando uma Aplicação Interativa do Zero

Primeiros Passos com Go: Criando uma Aplicação Interativa do Zero

Se você está começando a aprender Go e quer fazer algo prático, vou te mostrar como criar uma aplicação básica que permite incluir, editar, listar e remover pessoas. O objetivo aqui é aprender de uma forma leve.

Os dados serão salvos em memória e futuramente vamos evoluir nossa aplicação para fazer de um banco de dados.

Vamos dividir este tutorial em partes para que você entenda cada detalhe do código. Bora lá!

Começando o Projeto

Primeiro, você vai precisar ter o Go instalado no seu computador. Se ainda não tiver, é só acessar aqui e seguir as instruções. Beleza, depois de instalado, crie um arquivo chamado main.go e adicione o seguinte código básico para o nosso menu interativo.

Estrutura Inicial

A primeira coisa que vamos fazer é definir uma estrutura (struct) para armazenar as informações das pessoas que queremos manipular. Vamos ter dados como nome, idade, e-mail, telefone e endereço.

package main

import (
	"fmt"
)

type Pessoa struct {
	nome          string
	idade         int
	email         string
	dadosPessoais map[string]DadosPessoais
}

type DadosPessoais struct {
	telefone string
	endereco string
}

Aqui temos duas structs:

  • Pessoa: que guarda o nome, idade, e-mail e um map de DadosPessoais.
  • DadosPessoais: que guarda o telefone e o endereço.

Agora, o mais legal: vamos construir um menu interativo para adicionar, editar, listar e remover essas pessoas.

Criando o Menu

Um menu em Go nada mais é do que uma série de opções que o usuário pode escolher. Vamos usar um loop for para que ele fique rodando até o usuário escolher sair. Vamos usar um switch para tratar as opções.

Adicione o código abaixo dentro da função main:

func main() {
	for {
		exibirMenu()

		var opcao int
		fmt.Print("Escolha uma opção: ")
		fmt.Scanln(&opcao)

		switch opcao {
		case 1:
			incluirPessoa()
		case 2:
			editarPessoa()
		case 3:
			listarPessoas()
		case 4:
			removerPessoa()
		case 5:
			fmt.Println("Saindo...")
			return
		default:
			fmt.Println("Opção inválida, tente novamente.")
		}
	}
}

Aqui, estamos criando um loop infinito (for) que vai rodar até o usuário escolher a opção “Sair” (que é a opção 5). Dentro do switch, vamos chamar as funções de inclusão, edição, listagem e remoção.

Função exibirMenu()

Agora, vamos criar a função que exibe as opções para o usuário. Bem simples:

func exibirMenu() {
	fmt.Println("\nMenu:")
	fmt.Println("1 - Incluir Pessoa")
	fmt.Println("2 - Editar Pessoa")
	fmt.Println("3 - Listar Pessoas")
	fmt.Println("4 - Remover Pessoa")
	fmt.Println("5 - Sair")
}

Ela só exibe as opções disponíveis. Sem segredos!

Função incluirPessoa()

Vamos começar a alimentar nossa lista de pessoas. A função incluirPessoa vai perguntar ao usuário os dados da pessoa (nome, idade, e-mail, telefone, e endereço) e adicionar na nossa lista de usuários.

func incluirPessoa() {
	var nome, email, telefone, endereco string
	var idade int

	fmt.Print("Digite o nome: ")
	fmt.Scanln(&nome)

	fmt.Print("Digite a idade: ")
	fmt.Scanln(&idade)

	fmt.Print("Digite o email: ")
	fmt.Scanln(&email)

	fmt.Print("Digite o telefone: ")
	fmt.Scanln(&telefone)

	fmt.Print("Digite o endereço: ")
	fmt.Scanln(&endereco)

	// Criando a nova pessoa e adicionando na lista de usuários
	usuario := Pessoa{
		nome:  nome,
		idade: idade,
		email: email,
		dadosPessoais: map[string]DadosPessoais{
			"telefone": {telefone: telefone, endereco: endereco},
		},
	}
	usuarios = append(usuarios, usuario)

	fmt.Println("Pessoa incluída com sucesso!")
}

Aqui, estamos coletando os dados via terminal e criando uma nova pessoa com essas informações. Depois, usamos append para adicionar essa pessoa na nossa lista de usuarios.

Função listarPessoas()

Agora que já podemos adicionar pessoas, vamos listar elas na tela. A função listarPessoas vai mostrar todos os usuários cadastrados.

func listarPessoas() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	fmt.Println("\nLista de Pessoas:")
	for _, usuario := range usuarios {
		fmt.Printf("Nome: %s, Idade: %d, Email: %s, Telefone: %s, Endereço: %s\n",
			usuario.nome, usuario.idade, usuario.email, usuario.dadosPessoais["telefone"].telefone, usuario.dadosPessoais["telefone"].endereco)
	}
}

Essa função verifica se há usuários na lista. Se sim, ela imprime cada um na tela. Se não, ela avisa que não tem ninguém cadastrado.

Função editarPessoa()

A função editarPessoa vai permitir alterar os dados de uma pessoa. A gente busca a pessoa pelo nome e permite editar os campos que o usuário quiser.

func editarPessoa() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	var nome string
	fmt.Print("Digite o nome da pessoa que deseja editar: ")
	fmt.Scanln(&nome)

	for i, usuario := range usuarios {
		if strings.EqualFold(usuario.nome, nome) {
			var novoNome, novoEmail, novoTelefone, novoEndereco string
			var novaIdade int

			fmt.Print("Digite o novo nome (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoNome)

			fmt.Print("Digite a nova idade (ou pressione Enter para manter a atual): ")
			fmt.Scanln(&novaIdade)

			fmt.Print("Digite o novo email (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoEmail)

			fmt.Print("Digite o novo telefone (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoTelefone)

			fmt.Print("Digite o novo endereço (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoEndereco)

			if novoNome != "" {
				usuarios[i].nome = novoNome
			}
			if novaIdade != 0 {
				usuarios[i].idade = novaIdade
			}
			if novoEmail != "" {
				usuarios[i].email = novoEmail
			}
			if novoTelefone != "" {
				usuarios[i].dadosPessoais["telefone"] = DadosPessoais{
					telefone: novoTelefone,
					endereco: novoEndereco,
				}
			}

			fmt.Println("Dados da pessoa atualizados com sucesso!")
			return
		}
	}
	fmt.Println("Pessoa não encontrada.")
}

Função removerPessoa()

Se você quiser remover alguém, a função removerPessoa faz isso. Ela busca a pessoa pelo nome e a remove da lista.

func removerPessoa() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	var nome string
	fmt.Print("Digite o nome da pessoa que deseja remover: ")
	fmt.Scanln(&nome)

	for i, usuario := range usuarios {
		if strings.EqualFold(usuario.nome, nome) {
			usuarios = append(usuarios[:i], usuarios[i+1:]...)
			fmt.Println("Pessoa removida com sucesso!")
			return
		}
	}
	fmt.Println("Pessoa não encontrada.")
}

Aqui usamos o append para remover a pessoa da lista.

Aqui está o código completo com os comentários explicando cada parte relevante do processo, para criar o menu interativo com Go. Esse código inclui funções de inclusão, edição, listagem e remoção de pessoas. Os comentários servem para ajudar no entendimento do que está acontecendo em cada etapa.

package main

import (
	"fmt"
	"strings"
)

// Definindo a estrutura Pessoa, que contém os dados básicos da pessoa
type Pessoa struct {
	nome          string                  // Nome da pessoa
	idade         int                     // Idade da pessoa
	email         string                  // Email da pessoa
	dadosPessoais map[string]DadosPessoais // Mapa contendo os dados pessoais como telefone e endereço
}

// Definindo a estrutura DadosPessoais, que contém telefone e endereço
type DadosPessoais struct {
	telefone string // Telefone da pessoa
	endereco string // Endereço da pessoa
}

// Variável global para armazenar a lista de usuários
var usuarios []Pessoa

// Função principal que contém o loop do menu
func main() {
	for {
		exibirMenu() // Exibe o menu de opções

		var opcao int
		fmt.Print("Escolha uma opção: ")
		fmt.Scanln(&opcao) // Captura a opção escolhida pelo usuário

		// O switch executa uma função com base na opção escolhida
		switch opcao {
		case 1:
			incluirPessoa() // Chama a função para incluir uma nova pessoa
		case 2:
			editarPessoa() // Chama a função para editar uma pessoa existente
		case 3:
			listarPessoas() // Chama a função para listar todas as pessoas
		case 4:
			removerPessoa() // Chama a função para remover uma pessoa
		case 5:
			fmt.Println("Saindo...") // Encerra o programa
			return
		default:
			fmt.Println("Opção inválida, tente novamente.")
		}
	}
}

// Função que exibe o menu de opções para o usuário
func exibirMenu() {
	fmt.Println("\nMenu:")
	fmt.Println("1 - Incluir Pessoa")
	fmt.Println("2 - Editar Pessoa")
	fmt.Println("3 - Listar Pessoas")
	fmt.Println("4 - Remover Pessoa")
	fmt.Println("5 - Sair")
}

// Função para incluir uma nova pessoa no sistema
func incluirPessoa() {
	var nome, email, telefone, endereco string
	var idade int

	// Captura dos dados via terminal
	fmt.Print("Digite o nome: ")
	fmt.Scanln(&nome)

	fmt.Print("Digite a idade: ")
	fmt.Scanln(&idade)

	fmt.Print("Digite o email: ")
	fmt.Scanln(&email)

	fmt.Print("Digite o telefone: ")
	fmt.Scanln(&telefone)

	fmt.Print("Digite o endereço: ")
	fmt.Scanln(&endereco)

	// Criando a nova pessoa e adicionando na lista de usuários
	usuario := Pessoa{
		nome:  nome,
		idade: idade,
		email: email,
		dadosPessoais: map[string]DadosPessoais{
			"telefone": {telefone: telefone, endereco: endereco},
		},
	}
	usuarios = append(usuarios, usuario) // Adiciona o novo usuário ao slice

	fmt.Println("Pessoa incluída com sucesso!")
}

// Função para editar os dados de uma pessoa existente
func editarPessoa() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	var nome string
	fmt.Print("Digite o nome da pessoa que deseja editar: ")
	fmt.Scanln(&nome)

	// Loop para encontrar a pessoa pelo nome e permitir a edição
	for i, usuario := range usuarios {
		if strings.EqualFold(usuario.nome, nome) { // EqualFold ignora maiúsculas/minúsculas
			var novoNome, novoEmail, novoTelefone, novoEndereco string
			var novaIdade int

			// Captura os novos dados do usuário, permitindo pular com Enter
			fmt.Print("Digite o novo nome (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoNome)

			fmt.Print("Digite a nova idade (ou pressione Enter para manter a atual): ")
			fmt.Scanln(&novaIdade)

			fmt.Print("Digite o novo email (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoEmail)

			fmt.Print("Digite o novo telefone (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoTelefone)

			fmt.Print("Digite o novo endereço (ou pressione Enter para manter o atual): ")
			fmt.Scanln(&novoEndereco)

			// Atualiza os dados apenas se o novo valor foi informado
			if novoNome != "" {
				usuarios[i].nome = novoNome
			}
			if novaIdade != 0 {
				usuarios[i].idade = novaIdade
			}
			if novoEmail != "" {
				usuarios[i].email = novoEmail
			}
			if novoTelefone != "" {
				usuarios[i].dadosPessoais["telefone"] = DadosPessoais{
					telefone: novoTelefone,
					endereco: novoEndereco,
				}
			}

			fmt.Println("Dados da pessoa atualizados com sucesso!")
			return
		}
	}
	fmt.Println("Pessoa não encontrada.")
}

// Função para listar todas as pessoas cadastradas
func listarPessoas() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	// Exibe os dados de todas as pessoas cadastradas
	fmt.Println("\nLista de Pessoas:")
	for _, usuario := range usuarios {
		fmt.Printf("Nome: %s, Idade: %d, Email: %s, Telefone: %s, Endereço: %s\n",
			usuario.nome, usuario.idade, usuario.email, usuario.dadosPessoais["telefone"].telefone, usuario.dadosPessoais["telefone"].endereco)
	}
}

// Função para remover uma pessoa do sistema pelo nome
func removerPessoa() {
	if len(usuarios) == 0 {
		fmt.Println("Nenhuma pessoa cadastrada.")
		return
	}

	var nome string
	fmt.Print("Digite o nome da pessoa que deseja remover: ")
	fmt.Scanln(&nome)

	// Loop para encontrar a pessoa e removê-la da lista
	for i, usuario := range usuarios {
		if strings.EqualFold(usuario.nome, nome) { // Busca ignorando maiúsculas/minúsculas
			usuarios = append(usuarios[:i], usuarios[i+1:]...) // Remove a pessoa do slice
			fmt.Println("Pessoa removida com sucesso!")
			return
		}
	}
	fmt.Println("Pessoa não encontrada.")
}

Comentários Relevantes:

  1. Estruturas de Dados: Pessoa e DadosPessoais são estruturas que armazenam os dados de cada pessoa. A estrutura Pessoa contém um mapa de DadosPessoais, permitindo fácil acesso aos detalhes como telefone e endereço.
  2. Variável Global usuarios: Um slice global é usado para armazenar todas as pessoas adicionadas ao sistema.
  3. Funções:
    • incluirPessoa(): Captura dados do terminal, cria uma nova pessoa e a adiciona ao slice usuarios.
    • editarPessoa(): Permite editar os dados de uma pessoa existente, mantendo os valores atuais se o usuário não quiser alterar algum campo.
    • listarPessoas(): Exibe todas as pessoas cadastradas.
    • removerPessoa(): Remove uma pessoa do sistema, buscando pelo nome.
  4. Loop do Menu: O menu é executado em um loop contínuo dentro da função main, permitindo ao usuário executar várias operações até escolher a opção “Sair”.

Agora abra a pasta no terminal e digite o comando : go run main.go

Esse código permite que você pratique a interação com o usuário e manipulação de dados em Go, criando um sistema simples de gerenciamento de pessoas!

Agora você tem uma aplicação interativa que faz inclusão, edição, listagem e remoção de pessoas, tudo controlado por um loop simples no terminal. Se você quiser ir além, pode adicionar mais opções, como procurar por uma pessoa específica ou salvar esses dados em um arquivo.

Essa é uma ótima base para entender como trabalhar com inputs de usuário, manipulação de arrays (ou slices, no caso do Go) e estruturação de código.

Mais Posts

Como instalar o RabbitVCS no ubuntu 18.04

Como instalar o RabbitVCS no ubuntu 18.04

Caso você sendo usuário Linux e precise instalar um gerenciador de SVN temos como alternativa o RABBITVCS. São apenas dois... Leia mais

Entendendo o Service Container no Laravel

Entendendo o Service Container no Laravel

Quando você trabalha com Laravel, uma das ferramentas mais poderosas sob o capô é o Service Container. Mas o que... Leia mais

Entendendo o Conceito de Estado no React

Entendendo o Conceito de Estado no React

Em React, o estado refere-se a uma estrutura de dados que determina o comportamento do componente e como ele será... Leia mais

Função para fazer a tecla ENTER funcionar como a tecla TAB em formulários web.

Função para fazer a tecla ENTER funcionar como a tecla TAB em formulários web.

Segue função em Jquery que utilizei muito em projetos para permitir o comportamento da tecla TAB(pular campos do formulários) utilizando... Leia mais