GO - Criando um Hello-world
Tags: go, beginners, helloworld
Published: 2022-11-11 13:22:27

Recentemente recebi uma tarefa que precisava trabalhar em GO(GoLang), mais precisamente com módulos. Como precisava fazer algo simples e bem iniciante. Resolvi iniciar um novo projeto para então seguir para os módulos, pois o projeto em que trabalhei antes já estava bem avançado.

## Iniciando um novo projeto
Optei por usar o terminal nessa fase inicial, por comodidade de chegar até a pasta onde colocaria o projeto. Naveguei até  pasta que colocaria o projeto (`cd caminho`) e para então usar o _mkdir_ (`mkdir proj-teste`). Até aqui acredito que nada fora do padrão em um novo projeto.
Agora, pelo VS Code criei o arquivo `hello.go` onde coloquei o seguinte código:

```go
package projteste

func hello(name string) string {
	return "Hello " + name
}
```

Minhas intenções são bem claras no arquivo: 

- O pacote com seu devido nome; 
- A função `hello` que recebe uma `string` chamada `name` e retorna `Hello ` + a string, quis dar um passo inicial maior.

Eu já sabia que para escrever em tela precisava de um import, então fui no projeto que já estava feito e copiei o nome de lá, ficando assim:

```go
package projteste

import (
	"fmt"
)

func hello(name string) string {
	return "Hello " + name
}
```

De imediato meu VSCode reclamou do import, ignorei e salvei o arquivo. O VSCode simplesmente apagou as linhas do import. Reescrevi as linhas e senti falta do básico "como vou chamar isso?", então senti falta do básico `main()`. O código acabou ficando assim:

```go
package projteste

import (
	"fmt"
)

func main() {
	fmt.Println(hello("julio"))
}

func hello(name string) string {
	return "Hello " + name
}

```


## Resolvendo os erros
Agora sim! Consegui salvar sem a IDE apagar meu código ou reclamar de algo. Fui no terminal rodar o `go run hello.go`, para então receber na cara um `package command-line-arguments is not a main package`, foi aqui que desandei por desatenção. Li a mensagem de forma superficial e fui analisar meu código atrás da causa. Adicionei um `fmt.Println("hello()")` no `main`, logo abaixo do primeiro print. Rodei de novo e... quebrou. Como já estava no final do expediente e não consegui, deixei pro meu "eu do futuro" resolver hoje.

E lá vamos nós (de novo)! Tentei rodar novamente hoje, já sabendo que quebraria, porém queria rever a mensagem. Dafuq!? Eu já tinha o main na classe o que mais esse infeliz quer? Reli a mensagem com mais atenção e me veio o estalo "ele tá reclamando da falta de um pacote main" e o meu pacote atualmente se chama `projteste`, vamos tentar alterar isso. O inicio do código ficou assim:

```go
package main

// ...
```
Rodei o `go run hello.go` no terminal e na minha tela tinha o "hello()" finalmente! Troquei as linhas comentadas no `main` e tive um "Hello julio".

No final, meu código ficou assim:
```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println(hello("julio"))
}

func hello(name string) string {
	return "Hello " + name
}
```
Enfim, temos um `hello world` rodando! Hora de passar pros módulos.

## Lição aprendida
Leia e bendita mensagem de erro! Leia-a com atenção, ela é sua amiga! O eu do passado poderia ter resolvido isso ontem se tivesse dado devida atenção as mensagens.