Apresentando o Go e o Mggo Framework

Olá pessoal! Quero compartilhar minha primeira experiência de programação no Go.

Comecei a programar como desenvolvedor front-end. Depois mudei para o back-end em Python e, um pouco para mim, para o C # Asp.Net MVC. Mas recentemente, há alguns meses, conheci essa bela linguagem Go.

Porque ir


1 - linguagem compilada.
2 é uma linguagem muito incomum.

Estruturas, interfaces ... Eu tive que quebrar meu cérebro, reaprender. E o primeiro problema, acabado, é reaprender. Onde estão as aulas? Onde fica OOP? Onde estão seus padrões favoritos?

Mas, quebrando um pouco a cabeça, a linguagem Go foi revelada para mim e eu me apaixonei por ela. Bem, é claro, a primeira coisa que decidi escrever minha primeira "bicicleta", ou seja, o framework web chamado MGGO.

O que eu queria e o que eu aspirava


Claro, eu imediatamente quis criar uma estrutura MVC como o Asp.Net. Mas acabou não sendo tão simples, porque a linguagem Go é peculiar. Mas aqui está o que aconteceu:

Controladores


O controlador é uma estrutura na qual os métodos podem ser externos (api) e apenas internos, bem como os responsáveis ​​pela exibição.

Imediatamente em um exemplo, considere um controlador de notícias.

import mggo type News struct{ ID int Title string Text string } func NewNews() *NewNews{ return &NewNews{} } func init() { //   mggo.RegisterController("news", NewNews) } func(n *News) Read(ctx *mggo.BaseContext) News{ return News{1, "First News", "Text first News"} } func(n *News) IndexView(ctx *mggo.BaseContext, data *mggo.ViewData, path []string){ data.View = "news/news.html" data.Data["News"] data.Data["News"] = n.Read() } 


Depois disso, as notícias estão disponíveis em / news /

Onde news é o nome do controlador e a página principal é index, pela qual o método IndexView é responsável.

Agora sobre API. O controlador de notícias possui um método de leitura. Por padrão, é apenas serviço. Para permitir a solicitação da API a esse método, você precisa adicionar direitos ao método na função do controlador "init".

 func init(){ ... mggo.AppendRight("News.Read", mggo.RRightGuest) } 

Depois disso, o método Read está disponível para chamada de API a qualquer usuário.

 fetch("/api/", { "method": "POST", "headers": { 'Accept': 'application/json', 'Content-Type': 'application/json' }, "body": JSON.stringify({ "method": "News.Read", "params": {} }) }).then(res => res.Json()).then(console.log) 

Resultado

 {result: {ID:1, Title:"First News", Text:"Text first News"}} 

Um pouco sobre os parâmetros. Todos os parâmetros dentro do objeto params serão passados ​​como campos de estrutura.

Por exemplo, vamos modificar um pouco a função Read:

 func(n *News) Read(ctx *mggo.BaseContext) News{ if n.ID ==1 { return News{1, "First News", "Text first News"} } else { return News{} } } 

E a chamada da API deve estar com o ID do parâmetro: 1 - params {ID: 1})

O que mais?


PostgreSQL A biblioteca Go-pg está conectada na estrutura. Vamos pegar um exemplo imediatamente. Nosso controlador de notícias possui dados estáticos. Precisa ser mudado. Para fazer isso, a primeira coisa que você precisa fazer é criar uma tabela de Notícias. Adicione algumas linhas à função init.

 func init(){ ... mggo.InitCallback(func(){ mggo.CreateTable([]interface{}{(*News)(nil)}) }) } 

Agora, após a inicialização, obtemos a tabela de notícias, com os campos id, title e text.

Mude o método Read:

 func(n *News) Read(ctx *mggo.BaseContext) News{ mggo.SQL().Select(n) return *n } 

Se chamarmos o método News.Read com o ID do parâmetro: 1, como resultado, obteremos os dados da tabela de notícias com a chave 1.

Os recursos Go-pg podem ser encontrados na documentação .

Mas isso não é tudo. Tudo não pode ser descrito aqui. Espero escrever e postar documentação detalhada em breve. Aqui está um breve resumo do que o Mggo pode fazer.

⁃ Soquetes da Web
Events Eventos de servidor e cliente
Results Resultados do método de cache
⁃ Suporte a chamadas JsonRPC
⁃ Liba para controle rápido e criação de visualização

Por enquanto é tudo. Espero que alguém ache o artigo útil. Obviamente, existem várias outras estruturas prontas e legais. Eu só queria tentar fazer algo próprio para a minha experiência pessoal.

Link para o projeto

Link para um exemplo e início rápido

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


All Articles