Skip to content

chmenegatti/go-lua

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Integrando Hashmaps Lua com Golang: Controle de Status de Venda

Introdução

Lua é uma linguagem de script leve, rápida e projetada para ser facilmente embarcada em outras aplicações. Com sua sintaxe simples e desempenho impressionante, ela é uma escolha popular para adicionar flexibilidade a sistemas escritos em linguagens como Go. Por outro lado, Go (Golang) é conhecido por sua eficiência e simplicidade, tornando-o ideal para construir aplicações robustas e escaláveis.

A integração entre Lua e Go combina o melhor dos dois mundos: a versatilidade de Lua para scripting com a performance de Go. Neste artigo, exploraremos como usar Hashmaps em Lua para gerenciar estados em uma aplicação Go, focando em um exemplo prático de controle de status de vendas. Se você busca uma maneira elegante de adicionar lógica dinâmica ao seu código Go, continue lendo!


Contexto sobre Lua

Lua foi criada em 1993 no Brasil e se destaca por sua simplicidade, portabilidade e eficiência. Sua sintaxe minimalista facilita o aprendizado, enquanto recursos como garbage collection e tabelas (estruturas semelhantes a Hashmaps) a tornam poderosa. Tabelas em Lua são incrivelmente flexíveis, funcionando como arrays, dicionários ou até objetos.

Quando combinada com Go, Lua oferece vantagens significativas: flexibilidade para scripts dinâmicos, desempenho leve e extensibilidade para personalizar comportamentos sem recompilar o código principal. Casos de uso comuns incluem arquivos de configuração, regras de negócios personalizáveis e scripting em jogos ou ferramentas. Em nosso exemplo, usaremos Lua para gerenciar estados de venda, aproveitando sua capacidade de representar dados de forma simples e acessível.


Instalação e Configuração

Para começar, você precisará de Lua e uma biblioteca que conecte Lua a Go. Recomendo a biblioteca go-lua, que permite executar scripts Lua diretamente do seu código Go.

Passos:

  1. Instale Lua: No Linux ou macOS, use o gerenciador de pacotes (ex.: sudo apt install lua5.3 ou brew install lua). No Windows, baixe do site oficial.
  2. Instale Go: Certifique-se de ter Go instalado (versão 1.18+ recomendada).
  3. Adicione go-lua: Execute go get github.com/Shopify/go-lua.

Configuração Básica

Crie um projeto Go. Aqui está um exemplo simples de como chamar Lua a partir de Go:

package main

import (
	"fmt"

	"github.com/Shopify/go-lua"
)

func main() {
	l := lua.NewState()
	lua.OpenLibraries(l)

	if err := lua.DoString(l, `print("Hello from Lua!")`); err != nil {
		fmt.Println("Erro:", err)
	}
}

Execute com go run teste.go e veja Lua em ação!


Implementação do Controle de Status de Venda

Vamos criar um sistema para gerenciar o status de vendas, usando um Hashmap em Lua para representar os estados possíveis. Nosso exemplo incluirá status como "done", "waiting", "payed", "preparing", "canceled", "delivered" e "finished".

Crie um novo projeto e vamos inicializar o go e o git.

mkdir go-lua && cd go-lua

git init --initial-branch=main

go mod init github.com/seu-repo/go-lua

go get github.com/Shopify/go-lua

Definindo o Hashmap em Lua

Crie um arquivo sales.lua:

sales_status = {
    ["done"] = "pedido realizado",
    ["waiting"] = "aguardando pagamento",
    ["payed"] = "pagamento realizado",
    ["preparing"] = "em preparação",
    ["canceled"] = "cancelado",
    ["delivered"] = "entregue",
    ["finished"] = "finalizado"
}

function get_status(key)
    return sales_status[key] or "status inválido"
end

Este Hashmap associa cada chave de status a uma descrição em português. A função get_status retorna o valor correspondente a uma chave.

Código em Go

Agora, vamos integrar isso ao Go. Aqui está um exemplo que carrega o script Lua, acessa o Hashmap e atualiza o status de uma venda:

package main

import (
	"fmt"
	"log"

	"github.com/Shopify/go-lua"
)

func main() {
	// Inicializa um novo estado Lua
	l := lua.NewState()
	// Abre as bibliotecas padrão Lua para uso
	lua.OpenLibraries(l)

	// Carrega o arquivo Lua que contém nossas definições
	// O arquivo "sales.lua" deve existir no diretório de execução
	if err := lua.DoFile(l, "sales.lua"); err != nil {
		log.Fatal("Erro ao carregar o arquivo sales.lua:", err)
	}

	// Acessa a tabela "sales_status" definida no arquivo Lua
	l.Global("sales_status") // Coloca a tabela global "sales_status" no topo da pilha

	// Verifica se o objeto obtido é realmente uma tabela
	if !l.IsTable(-1) {
		log.Fatal("'sales_status' não é uma tabela")
	}

	// Obtém o valor associado à chave "payed" na tabela
	l.Field(-1, "payed") // Obtém sales_status["payed"]

	// Verifica e converte o valor para string
	status, ok := l.ToString(-1)
	if !ok {
		log.Fatal("Erro ao acessar o status: valor não é uma string")
	}

	fmt.Println("Status atual:", status) // Output esperado: "pagamento realizado"

	// Remove o valor do topo da pilha
	l.Pop(1)

	// Chama a função Lua "get_status"
	l.Global("get_status") // Coloca a função no topo da pilha

	// Verifica se o objeto obtido é realmente uma função
	if !l.IsFunction(-1) {
		log.Fatal("'get_status' não é uma função")
	}

	l.PushString("delivered") // Empilha o argumento para a função

	// Chama a função (1 argumento, 1 resultado)
	l.Call(1, 1)

	// Verifica e obtém o resultado
	if !l.IsString(-1) {
		log.Fatal("Resultado da função não é uma string")
	}

	result, ok := l.ToString(-1)
	if !ok {
		log.Fatal("Erro ao obter o resultado da função")
	}
	fmt.Println("Resultado da função:", result) // Output esperado: "entregue"

	// Remove o resultado da pilha
	l.Pop(1)

	// Função para atualizar status
	updateSaleStatus(l, "123", "preparing")
}

// Função para atualizar o status de uma venda
// Parâmetros:
// - l: estado Lua
// - saleID: identificador da venda
// - newStatus: o novo status a ser definido
func updateSaleStatus(l *lua.State, saleID, newStatus string) {
	// Obtém a tabela global sales_status
	l.Global("sales_status")

	// Verifica se é uma tabela
	if !l.IsTable(-1) {
		log.Printf("'sales_status' não é uma tabela")
		return
	}

	// Acessa o valor para a chave do novo status
	l.Field(-1, newStatus)

	// Verifica se o status existe na tabela
	if l.IsNil(-1) {
		fmt.Printf("Status '%s' inválido para venda %s\n", newStatus, saleID)
		l.Pop(2) // Remove nil e a tabela da pilha
		return
	}

	// Verifica se o valor é uma string
	if !l.IsString(-1) {
		fmt.Printf("O valor para o status '%s' não é uma string\n", newStatus)
		l.Pop(2) // Remove o valor e a tabela da pilha
		return
	}

	// Obtém a descrição do status
	statusDesc, _ := l.ToString(-1)
	fmt.Printf("Venda %s atualizada para: %s (%s)\n", saleID, newStatus, statusDesc)

	// Limpa a pilha
	l.Pop(2) // Remove o valor e a tabela da pilha
}

Explicação

  1. Carregamento: O script sales.lua é executado com lua.DoFile.
  2. Acesso ao Hashmap: Usamos l.Global e l.Field para acessar valores diretamente do Hashmap sales_status.
  3. Manipulação: A função get_status é chamada via l.Call, passando uma chave como argumento.
  4. Atualização: A função updateSaleStatus verifica se o novo status é válido e exibe o resultado.

Este código é simples, mas pode ser expandido para persistência em banco de dados ou lógica mais complexa.


Benefícios e Considerações

Vantagens

  • Flexibilidade: Lua permite alterar regras de negócio sem recompilar o código Go.
  • Leveza: Scripts Lua têm baixo impacto na performance.
  • Manutenção: Hashmaps em Lua são fáceis de editar e entender, mesmo para equipes não técnicas.

Desafios

  • Debugging: Erros em Lua podem ser mais difíceis de rastrear; use logs detalhados.
  • Segurança: Valide entradas para evitar execução de código malicioso em Lua.
  • Dependências: Certifique-se de que a biblioteca go-lua esteja atualizada.

Performance e Escalabilidade

Para aplicações pequenas, essa abordagem é extremamente eficiente. Em sistemas maiores, considere limitar o uso de Lua a tarefas específicas, mantendo a lógica crítica em Go para maximizar a performance.


Conclusão

Integrar Lua com Go oferece uma solução elegante para gerenciar estados dinâmicos, como o status de vendas em nosso exemplo. Lua traz flexibilidade e simplicidade, enquanto Go garante robustez e escalabilidade. Este artigo demonstrou como configurar o ambiente, criar um Hashmap em Lua e manipulá-lo via Go.

Experimente essa integração no seu próximo projeto! Você pode estender o exemplo adicionando validações, mais funções Lua ou até scripts para relatórios. Outras ideias incluem usar Lua para configurações de API, regras de validação ou automação de tarefas. A combinação de Lua e Go é um terreno fértil para inovação.

O que você acha de usar Lua com Go no seu trabalho? Compartilhe suas ideias nos comentários!

#Golang #Lua #DesenvolvimentoDeSoftware #Programação #Tecnologia

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published