Giter Site home page Giter Site logo

crgimenes / grupo-estudos-golang Goto Github PK

View Code? Open in Web Editor NEW
1.0K 105.0 150.0 6.62 MB

Material para estudo de Golang, tutoriais, videos e exemplos para quem quer aprender Go

Home Page: https://crg.eti.br/tags/grupo-estudos-golang/

License: Creative Commons Zero v1.0 Universal

Go 95.16% HTML 1.62% Shell 0.30% Makefile 0.60% C 1.43% C++ 0.72% Dockerfile 0.02% Lua 0.15%
golang go tutoriais

grupo-estudos-golang's Introduction

Grupo de Estudos de Golang Licença Creative Commons

Exemplos antigos

Os exemplos estão sendo reescritos, muita coisa antiga precisa ser ajustada e melhorada. Os exemplos antigos estão no diretório "nao_tratados".


Comunidade

Um pouco de história

Por volta de 2015 eu estava procurando uma linguagem de programação moderna que atendesse a alguns critérios que considero importantes, deveria ser simples, compilada, abrangente e com uma boa comunidade. Com capacidade para criar executáveis multiplataforma e que aproveitasse as características de multi-processamento das máquinas modernas.

Go caiu como uma luva e comecei a usar nos meus projetos. No início de 2016 no ABC Makerspace criei um pequeno curso, o Go-Hands-On e de lá iniciamos o que acabaria se tornando o grupo de estudos.

Desde aquela época os objetivos do grupo continuam praticamente os mesmos, estudar a linguagem de programação Go e tecnologias relacionadas, dar apoio para quem está iniciando assim como manter atualizados os programadores mais experientes, criar conteúdo em português falado no Brasil.

No dia 11 de maio de 2016 criei o repositório do Grupo de Estudos de Golang no GitHub, essa se tornou nossa data de início oficial. De lá para cá fizemos centenas de encontros, praticamente toda semana, escrevemos muitos exemplos, gravamos muitos vídeos, mas o mais importante é que conhecemos muita gente boa disposta a ajudar e compartilhar o que sabe.

Esse material doi criado com ajuda de inumeras pessoas, sinta-se a vontade para usar, compartilhar e melhorar.

CRG


Instalando

A instalação do Go é bastatnte simples, o caminho mais direto é baixar o instalador para a sua plataforma e executá-lo, ou se preferir baixar os binarios.

Em ambienes UNIX/Linux geralmente é comum instalar o Go em /usr/local/go ou $HOME/go, e em ambientes Windows em C:\Go.

Apos a instalação é necessário configurar a variável PATH para que o sistema operacional possa encontrar o compilador.

Versõs antigas do Go exigiam que outras variaveis fossem condiguradas, hoje essas configurações são opcionais.

Lembre! Caso esteja usando algum anti-virus, é necessário adicionar o diretório de instalação do Go e seu diretório de projetos na lista de exceções. É comum que o anti-virus bloqueie a execução de programas compilados com Go e as vezes de forma silenciosa.

Download

Faça o download do instalador correspondente ao seu sistema operacional ou dos binarios em https://go.dev/dl/.

Microsoft Windows

Apos executar o instalador, Go estará instalada em

C:\Go

Mac OS X

Apos executar o instaldor, Go estará instalada em:

/usr/local/go

Mac OS X - Alternativa - Usando Homebrew

Se você usa o Homebrew, o Go pode ser instalado com dois simples comandos:

brew update
brew install go

Linux

Você pode descompactar o arquivo tar.gz em /usr/local ou $HOME e configurar a variável PATH.

tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz

Perguntas frequentes

Qual framework, ORM, banco de dados, etc. usar?

  • Go é uma linguagem de programação minimalista, não possui um framework padrão como Django, Rails ou Laravel. Antes de procurar algo externos tente usar as bibliotecas padrão, elas são muito boas e completas.

  • ORM é um conceito que não é muito usado em Go, idealmente você deve usar um banco de dados que tenha um driver nativo para Go, como PostgreSQL, MySQL, SQLite, etc. e escrever seus proprios SQLs.

  • Frameworks web são muitos, alguns populares são o Gin, Echo, Fiber, Beego, etc. mas você pode usar o pacote net/http da biblioteca padrão, ele provavelmente vai resolver seu problema sem adicionar complexidade ou dependências.

O que é migration?

  • Migration é uma ferramenta que permite que você controle as mudanças no banco de dados, geralmente é usado para criar tabelas, adicionar colunas, etc. Existem muitas ferramentas de migration, você pode usar uma delas ou escrever suas proprias migrations.

Qual paradigma/padrão de projeto usar em Go.

  • Go esta mais para programação estruturada/procedural. Go não possui um padrão de projeto como MVC, MVVM, etc. Você pode usar o que achar melhor. Orientação a objetos é possivel em Go, mas não é muito comum.

Porque o tratamento de erro é tão verborragico?

  • Go não possui exceções, o tratamento de erro é feito com o retorno de um erro, isso é uma escolha de design da linguagem. O tratamento de erro é explicito e isso é uma das coisas que torna Go uma linguagem simples e fácil de entender. Os erros são tratados imediatamente onde eles acontecem tornando o debug mais fácil. Uma dica importante é sempre tratar todos os erros, muitas vezes um erro que parece impossível de acontecer, acontece.

Como fazer boas perguntas e dar boas respostas

Algumas dicas para melhorar a interação com o grupo quando for enviar perguntas ou respostas.

Especifique o Problema:

  • Deixe claro qual é o problema que você está enfrentando. Uma descrição precisa auxiliará os outros a entenderem e oferecerem soluções.

Demonstração do Código:

  • Forneça um trecho de código, e inclua a saída esperada e atual. Isso dará aos outros uma ideia melhor do que está acontecendo.

  • Você pode usar o The Go Playground para compartilhar exemplos de código. ou então use o markdown para formatar o código. Geralmente basta colocar o código entre três crases.

Ambiente de Desenvolvimento:

  • Mencione a versão do Go que você está usando e outras configurações de ambiente que possam ser relevantes para o problema, como o sistema operacional, por exemplo.

Formato é importante:

  • Formate sua pergunta de maneira clara e legível, com uso adequado de marcações, para facilitar a leitura por outros membros do grupo.

Revise o Texto:

  • Antes de perguntar utilize as ferramentas de busca. Mesmo que não encontre a resposta, isso ajudará a formular sua dúvida de maneira mais clara.

  • Consulte nosso FAQ e o código de conduta.

  • Ao formular uma pergunta, inclua as etapas que já tentou para resolver o problema.

  • Mantenha a pergunta concisa; perguntas mais curtas tendem a ser respondidas mais rapidamente.

  • É útil demonstrar o problema com um trecho de código. Evite enviar imagens da tela; em vez disso, crie um pequeno exemplo que ilustre a dúvida ou problema em poucas linhas.

  • Se desejar, use o The Go Playground. No entanto, esteja ciente de que o playground grava os exemplos compartilhados, então evite colocar dados ou códigos sensíveis.

  • Se ninguém responder sua pergunta, não se preocupe. Pode ser que ninguém tenha a resposta no momento. Não leve para o lado pessoal.

  • Respeite a opinião dos outros. Nós programadores temos fortes opiniões sobre o que é melhor e adoramos discutir o melhor de tudo: melhor procedimento, melhor editor, melhor sistema operacional, etc. Seja objetivo e não prolongue discussões.

  • Quando escrever, evite anglicismos mas tente se manter próximo da forma popular da língua. Por exemplo: nós adotamos alguns anglicismos como mouse, kernel, etc. são comuns e aceitáveis. Aqui tem algumas substituições úteis.

  • Quando responder ao grupo, seja exemplar e lembre-se de que você é a referência que outros programadores seguirão.


Como contribuir

Primeiros passos

De uma olhada nas issues e veja se o que você quer fazer já não esta sendo discutido, se estiver ótimo, participe da discussão e de suas ideias caso não esteja você pode criar uma nova issue para discutirmos ou se preferir pode também mandar diretamente um pull request, só não esqueça de descrever muito bem o que você quer mudar/adicionar.

Formato

Material novo idealmente deve ser organizados em diretórios e ter três arquivos, um README.md descrevendo o exemplo, um exemplo.go contendo o exemplo propriamente dito e um exemplo_test.go.

exemplo/README.md
exemplo/exemplo.go
exemplo/exemplo_test.go

Cuidado com o código

Antes de mandar um pull request formate seu código com go fmt. Também é uma boa ideia passar uma ferramenta de analize estatica como golint por exemplo.

Não se prolongue demais

Uma das características que é importante manter são exemplos curtos e de fácil entendimento, tenta fazer com que os exemplos caibam em uma tela, tudo bem se não for possível, apenas mantenha isso em mente.

Exemplos rápidos, curtos, diretos e de fácil entendimento são nossa meta.

Inclua seus exemplos no The Go Playground

Inclua um link sob os exemplos que você escrever apontando para o https://play.golang.org, dessa fora o leitor pode testar seu exemplo imediatamente. Obviamente isso não é possivel com qualquer exemplo, mas onde for possivel é bom colocar.

Arquivo README.md e Rodapé

Discuta com os outros desenvolvedores o melhor lugar para colocar o seu tutorial na lista do arquivo README.md, a ideia é que os tutoriais estejam em ordem complexidade.

Enviando uma contribuição

  • Faça um fork do projeto.
  • Crie uma branch com as suas modificações git checkout -b exemplo-fantastico.
  • Faça commit das suas alterações git commit -m 'Implementação do novo exemplo fantástico'.
  • Faça um push na sua branch git push origin exemplo-fantastico.
  • Faça um pull request com suas alterações.

Licença de uso

Esse material é livre, sob a licença Creative Commons, CC BY-SA. você pode usar da forma que preferir, apenas lembre de citar a fonte, não apenas copie, no lugar disso acrescente, melhore e compartilhe, assim todos ganhamos.

Cesar Gimenes

grupo-estudos-golang's People

Contributors

aalvesjr avatar crgimenes avatar dependabot[bot] avatar diegofsousa avatar digenaldo avatar edwardmartinsjr avatar faelp22 avatar felipeweb avatar geiltonxavier avatar hitalos avatar jeffprestes avatar jg19 avatar katarinamai avatar paulopraxedes avatar rgerardi avatar testwill avatar vmesel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

grupo-estudos-golang's Issues

Trocar nomes de variáveis para não parecerem palavras reservadas

Eu costumo escrever as variáveis em ingles e as vezes elas parecem palavras reservadas para quem não conhece a linguagem, por exemplo "result" não é uma palavra reservada.
Preciso percorrer os códigos e renomear as variáveis para normas nomes mais didáticos.

RabbitMQ e Kafka

Será que rola uma demo consumindo uma fila seja em RabbitMQ ou Kafka usando GO?

Converte em uma estrutura Hugo

Acho muito legal a ideia do repositório só peca por falta de melhor indexação no Google (atingir/ajudar mais pessoas).
Qual a opinião de você em converter (reestruturar) o conteúdo em um site Hugo?

Corrigir sequência de links no rodapé

Organizar a sequencia de links no rodapé de acordo com o índice

ToDo

  • Exemplo Configurando deveria ter um link para Workspace e não para Ola mundo;
  • Exemplo Ola Mundo deveria ter um link para Workspace e não para Configurando`;
  • Exemplo Goroutines Waitgroup deveria retornar para Goroutines e não para Error;
  • Exemplo Select deveria retornar para WaitGroup e não para Goroutines;
  • Exemplo Http deveria ter o link para RegExp e não para Tratando Sinais;
  • Adicionar links dentro do exemplo de RegExp;
  • No exemplo de Tratando sinais, alterar link para retornar para exemplo de RegExp;

Talvez adotar um padrão para os links como: "tudo minúscula" ou "sempre começar com maiúscula"

Essa issue só faz sentido ser trabalhada de acordo com o definido em #26

Exemplos com package math

Quero colocar alguns exemplos usando o pacote math mas não sei qual a melhor ordem na lista de exemplos. Por enquanto eu inclui apenas dois exemplos de geração de senoides (senoide.go e senoide2.go)

Também preciso de ideias de outros exemplos interessantes.

Criar diretório de exemplos e revisar eles

Devemos revisar todos os exemplos e atualizar para o go.mod, além disso devemos ajustar cabeçalho do hugo conforme o último encontro dia 15/10/2020 substituindo + para -. Importante cada pull requeste aberto vincular com essa issue.

TODO:

  • Criar diretório de exemplos
  • array
  • ascii7
  • assets
  • autoupdate
  • beanstalk
  • botao_e_LED
  • build_tags
  • channel
  • context
  • cpp
  • crawler
  • crc
  • data-race
  • db
  • defer
  • doomfire
  • env
  • error
  • exec
  • for
  • funcoes
  • go_com_c
  • goaleatorio
  • goalfabeto
  • godoc
  • godolar
  • goenglish
  • goroutines
  • goroutines_waitgroup
  • goto
  • http
  • http_get
  • http_middleware
  • http_templates
  • interface
  • interface_closer
  • ioutil
  • json
  • lua
  • map
  • myfs
  • net
  • ola_mundo
  • package
  • plugin
  • ponteiros
  • protobuf
  • pwm
  • quine
  • ras
  • rascunhos
  • readline
  • reflection
  • regexp
  • reverse_proxy
  • select
  • serial
  • server
  • sessions
  • shadow
  • signals
  • slice
  • sliceXarray
  • smtp
  • struct
  • switch
  • syncMap
  • tcp
  • testing
  • time
  • unixDomainSocket
  • variaveis
  • wikipedia
  • xml
  • zeroconf
  • zip

Exemplos usando play.golang.org direto na pagina

Inicialmente eu não separei o material em diretórios porque o numero de arquivos era pequeno e eu queria uma interação mais fluida e direta nos meus workshops, mas graças as contribuições o numero de arquivos esta crescendo e alguns exemplos ficariam melhor em múltiplos arquivos.

A ideia é criar um diretório para cada exemplo assim como hoje temos os arquivos exemplo.md e exemplo.go teríamos o diretório exemplo/ e dentro deles os arquivos

ficando:
exemplo/exemplo.md
exemplo/exemplo.go

Usar sistema de labels nas issues

Pensando em atrair mais pessoas para contribuir com o repositório acho legal começarmos usar o sistema de labels para issues, assim conseguimos organizar as melhorias e contribuições.

Dado que o conteúdo desse repositório é em pt-br nada mais justo de manter as labels em pt-br 😄

Interfaces

No ultimo evento o pessoal pediu para explicar interfaces, coisa que eu tinha deixado de fora assim como structs para evitar complexidade em um material que teoricamente devi ser básico para instalar o ambiente e iniciar em go para quem nunca viu nada... mas parece que crescer é inevitável, então é necessário bolar uma forma simples e didática de explicar interfaces e structs.

reunificando contas do grupo

Pessoal,

Antigamente alguns recursos do grupo de estudos ficavam em contas minhas. Por exemplo, o canal do grupo no YouTube era o meu canal que ainda ficava na conta da minha empresa, o repositório, a pagina com artigos, etc. Para não misturar muito o conteúdo, eu acabei criando contas separadas e organizações separadas.

E dá trabalho ficar mantendo outras contas, páginas, etc. Por isso a algum tempo estou considerando reunificar esses recursos (paginas, repositórios, canal do YouTube, etc.) com os meus. 

Dessa forma eu teria apenas uma conta para gerenciar e não teria mais conflitos de, por exemplo, onde publicar um artigo de que eu realmente queria publicar no meu site, mas por ser Go casaria com o grupo de estudos. 

Todo o conteúdo continuara Creative Commons como é desde o início.  

Em outras palavras, foi um erro dividir os recursos e eu gostaria de reunificar, mas como isso é uma comunidade, eu gostaria de saber se alguém tem algo contra isso antes de proceder com a reunificação.

Alguns exemplos precisam de uma explicação mais elaborada

O material foi escrito inicialmente para ser usado em workshops e por esse motivo alguns dos exemplos não funcionam bem se não tiver alguém explicando.

Precisamos elaborar melhor os textos para que eles funcionem para o leitor que não tem alguém a mão para explicar.

Entretanto quando for incluir mais explicações tente preservar a dinâmica de experimentar e testar rapidamente. Evite textos grandes e complicados, vá direto ao ponto.

Testes

Quando iniciei a escrita do material a ideia era um workshop de duas horas, e justamente por esse motivo muita coisa foi inicialmente deixada de fora inclusive testes. Agora com o material crescendo e novos conteúdo sendo adicionado por outras pessoas é importante termos testes até para reforçar essa boa pratica.

A ideia é termos um arquivo de teste para cada exemplo ficando:

exemplo/exemplo.md
exemplo/exemplo.go
exemplo/exemplo_test.go

Note que é necessário separar o material em diretórios como descrito na issue #21

Links no rodapé

Os links no rodapé para levar de uma pagina para outra parecem interessantes em um primeiro momento mas complica um pouco na hora de adicionar material novo ou mudar a ordem dos tutoriais.
A pergunta é vale a pena manter esses links?

Renomear repositório

Quero renomear o repositório, principalmente remover os traços
Go-Hands-On já não reflete tão bem a forma que material esta tomando.

Qual sua opinião? Sugestões de nomes?

dividir em diretórios

Estamos começando a adicionar conteudo mais avançado como acesso a banco de dados, filas, etc.

Talvez seja interessante dividir o conteudo em diretórios para não ficar tudo na raiz e agrupar de forma mais logica.

Exemplo:
/code para o core da linguagem
/db para bancos de dados
/queue para filas

Então ficaria /db/postgresql, /db/sqlite, /db/mysql, e assim por diante.

Na raiz de cada diretorio colocamos um README.md mais detalhado como já fazemos com os outros exemplos. Mas mesmo assim no README.md principal colocamos o caminho completo para cada entrada nos subdiretorios para o usário não ter que ficar navegando em subitens e termos um indice completo logo na primeira pagina.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.