# Tem ABAP aqui no meu programa em Go (GoLang)?

Comecei estudar a linguagem de programação **GO** ou como muitas pessoas a chamam, *GoLang da Google*. Depois de um workshop rápido, muito esclarecedor e motivador com o [Jeff Otoni](https://dev.to/jeffotoni), decidi encarar essa jornada.

Atualmente, sou desenvolvedor e arquiteto de software imerso no mundo SAP e suas tecnologias, então conheço um pouquinho de ABAP, SAP UI5, Fiori, OData e mais uma sopa de letrinhas específica do mundo SAP. No entanto, o mercado está em constante evolução e demanda, por isso, gosto de aprender e me manter atualizado sobre outras tecnologias e linguagens para aplicar melhores práticas, aprender o que os outros estão fazendo de legal e não passar aperto quando um projeto sair do "padrão".

A linguagem Go é fortemente tipada, compilada, o que a diferencia da maior parte das linguagens populares atualmente. Com uma sintaxe de código incrivelmente simples (imagine, até a data que estou escrevendo esse artigo, a linguagem só possui 25 palavras reservadas! [Confira aqui!](https://golang.org/ref/spec)), ela foi projetada para simplificar e resolver os maiores problemas encontrados no desenvolvimento de software, principalmente tratando de web, (listados no dia a dia da gigante Google, onde a linguagem foi construída), como por exemplo, escalabilidade, concorrência, paralelismo, produtividade e facilidade ao escrever e manter código, softwares com grande dependência de comunicação via rede, padronização de formatação de código em projetos grandes e com muitos colaboradores trabalhando ao mesmo tempo (quem nunca discutiu se a '{' fica na linha do if ou em uma linha abaixo? que comece a guerra, risos), e mais um tantão de coisas legais que vale a pena você pesquisar (esse artigo escrito por Rob Pike, um dos criadores da linguagem é bem interessante [Go at Google: Language Design in the Service of Software Engineering](https://talks.golang.org/2012/splash.article)).

Para começar minha jornada de aprendizado não foi difícil. Utilizo macos e não tive problemas na instalação do ambiente GO, bastou baixar a imagem correta do sistema operacional ([Download Go](https://golang.org/dl/)), instalar e começar rodar. Iniciei pelo famigerado "Hello World!", que você pode codar em um arquivo fonte na sua máquina local, fazer o build (ou compilar, como alguns gostam) e executar o binário gerado. Você também pode usar o comando ***go run \[file\]*** para executar o código diretamente, sem precisar fazer o build, ou ainda, se não quiser instalar nada, pode simplesmente utilizar o [playground](https://play.golang.org/) da linguagem para começar codar e experimentar a linguagem diretamente no browser.

Logo depois do "Hello world!", a maioria dos programadores já pensam em como declarar variáveis e funções, queremos variáveis para fazer cálculos complexos porque vamos dominar o mundo, integrar o sistemas via api e zas, e zas, zas (Chaves mandou lembranças, risos). Comigo não foi diferente, busquei alguns materiais que apresentam os conceitos da linguagem passo a passo, explicando trechos de código e te desafiando escrever códigos utilizando o que foi aprendido. Aqui, gostaria de ressaltar que achei muito material legal, de boa qualidade, em português, sim PT-BR, com textos bem escritos e divertidos, ensinando os conceitos e apresentando exemplos de código, confiram a jornada GoSchool no [Gommunity](https://medium.com/gommunity) e os artigos legais em inglês [go no dev.to](https://dev.to/t/go). Sensacional, me ajudou bastante nestes primeiros contatos com a linguagem, os conceitos e o jeito de fazer. O meu muito obrigado à essas pessoas que investem seu tempo no ensino de tecnologia escrevendo artigos e tutoriais em nossa língua nativa.

Bom, com o básico da linguagem aprendido, fui buscar projetos mais práticos e encontrei como fazer uma simples API em Go neste artigo [aqui](https://medium.com/@rafaelacioly/construindo-uma-api-restful-com-go-d6007e4faff6). Fui seguindo o passo a passo do tutorial e magicamente, com 74 linhas de código em **Go**, tinha construído minha primeira web api, permitindo recuperar uma lista de contatos, inserir um novo contato e excluir um contato.

## Similaridade com o ABAP

Como sempre faço, ao finalizar o tutorial, fui rever todo o código e checar se eu tinha dúvida em algum trecho de código ou conceito utilizado e aí tive uma surpresa boa. Analisando a declaração de uma estrutura em Go, encontrei uma similaridade com declaração de estrutura em ABAP.

Compare abaixo:

### Declaração das estruturas Person e Address em Go:

```go
type Person struct {
    ID        string
    Firstname string
    Lastname  string
    Address   *Address
}

type Address struct {
    City  string
    State string
}
```

### Declaração das estruturas Person e Address em ABAP:

```plaintext
TYPES:
  BEGIN OF address,
    city  TYPE string,
    state TYPE string,
  END OF address,

  BEGIN OF person,
    id        TYPE string,
    firstname TYPE string,
    lastname  TYPE string,
    address   TYPE address,
  END OF person.
```

Além disso, a declaração de métodos em Go é bem similar à declaração de rotina (form) no ABAP.

### Declaração de um método para imprimir o nome completo em Go:

Para funcionar como método, em Go, criamos uma função recebendo como parâmetro antes do nome da função o tipo ao qual queremos associá-la, neste caso, ao nosso tipo Person criado anteriormente. Para utilizar a nossa função que trabalhará como método, podemos acessar o nome da função diretamente de uma variável do tipo que declaramos no parâmetro e omitir a passagem do parâmetro. Conforme código abaixo:

```go
func (p Person) PrintFullName() {
    fmt.Println(p.Firstname, p.Lastname)
}

func main() {
    pessoa := Person{
        ID:        "1",
        Firstname: "Valdir",
        Lastname:  "Mendes",
    }
    pessoa.PrintFullName()
}
```

### Declaração de uma rotina para imprimir o nome completo em ABAP:

No ABAP, não conseguimos fazer uma função ou rotina funcionar como um método, mas para mim, existe uma similaridade interessante na estrutura de criação. Recebemos o tipo de uma estrutura que foi criada dentro do programa como parâmetro na rotina criada que consequentemente só funcionará para essa estrutura, assim como no método/função do Go. Confira abaixo:

```plaintext
  DATA: pessoa TYPE person.

  pessoa-id        = '1'.
  pessoa-firstname = 'Valdir'.
  pessoa-lastname  = 'Mendes'.

PERFORM print_full_name USING pessoa.

FORM print_full_name USING p TYPE person.

  WRITE: p-firstname, p-lastname.

ENDFORM.
```

Em resumo, gostaria de compartilhar com você um pouquinho da minha jornada de aprendizado da linguagem Go e essa similaridade encontrada em uma das linguagens que trabalho no cotidiano. E aí, o que achou?
