fala pessoal E aí como que vocês estão eu tô aqui para trazer um assunto muito legal para vocês para quem não tá sabendo tá aí desligado do mercado de tecnologia a gente tem percebido que a linguagem go ela tá crescendo muito tem muitas empresas que estão precisando desses profissionais aí para manter os seus sistemas e acompanhando algumas pessoas aí alguns amigos que estão fazendo entrevistas para trabalhar como pessoas desenvolvedoras backend utilizando a linguagem go tem caído algumas perguntas muito comuns nesses processos seletivos E é isso que a gente vai fazer aqui hoje eu vou trazer
para vocês cinco perguntas de processos seletivos para pessoas desenvolvedoras golang Então vem comigo tá vamos lá Pergunta número um por que que eu devo escolher go leng né Qual é o benefício de utilizar Gol comparado a outras linguagens do mercado eu Laí responderia que o principal benefício é a simplicidade dessa linguagem você consegue fazer muita coisa com poucas não poucas linhas de código né é utilizando poucas palavras reservadas aí da linguagem é um é o que a gente vende o principal Jabá além da concorrência né Se eu conseguir utilizar modelos de concorrência é a simplicidade
e que go tem apenas 25 palavras reservadas por aí tá tem um livro aqui esse livro é muito famosinho aqui entre as pessoas que estão começando a aprender Gol ele tem a história do desenvolvimento da linguagem o que que motivou né os criadores a criar uma nova linguagem de GO que foi para lidar com essas questões de grandes softwares acabarem ficando ou defasados ou tipo Eles crescem tanto que é difícil dar manutenção a longo prazo né então com go você consegue fazer tudo isso de um jeito um pouco mais simples e também por ela ter
sido uma linguagem criada aí com sistema que atende a concorrência é que utiliza o modelo de pacotes e instalação que é fortemente tipada Isso facilita muito na hora do do compilador né então ele acaba sendo muito rápido porque go não deixa você compilar o que você não tá usando Então já descarta você tudo isso enquanto você tá desenvolvendo o que facilita muito não levar lixo ali na hora de compilar as coisas ou também pode ser considerado uma plataforma porque só com essa linguagem você consegue fazer servidores web consegue fazer interfaces de linha de comando chamar
alguns processos ou binários aí do seu sistema operacional enquanto você tá fazendo seu programinha ali em go né você chama esses comandos você consegue dar alguma manutenção eh fazer algum gerenciamento na sua infraestrutura por meio do seu programa in E também o mais legal que eu gosto é que você no fim depois de você criar o seu código bonitinho você gera um binário direto para código de máquina o que que isso significa se a sua máquina de produção vai ser um Linux ou vai ser um Windows você consegue gerar um binário para esses sistemas operacionais
como saída Então você criou um programinha lá que consulta o CP né E você vai rodar ele no Linux na máquina que você vai rodar D esse binário você não precisa instalar Nada só jogar o pacotinho do binário e executa ele no sistema operacional Então essa é a parte que eu mais gosto né da simplicidade de eu poder escolher a linguagem Gol para subir o meu sistema a pra produção Então isso é o que eu responderia pergunta dois essa daqui é muito famosa tá Mas explique o que é uma goroutine ou o que é uma
goroutine que é na verdade o Jabá aí da linguagem que o pessoal fala que é o dos maiores poderes da dessa linguagem uma routine nada mais é que você conseguir executar uma função né ou um método ã de maneira concorrente você executar uma função de maneira concorrente não significa que é de maneira paralela tá vou até mostrar um exemplo de uma imagem muito famosa aqui tá que concorrência não é a mesma coisa paralelismo aqui na concorrência As coisas elas acontecem ao mesmo tempo porém disputando os mesmos recursos Então você tá disputando os mesmos núcleos de
CPU para acessar algumas funções e se elas utilizarem a mesma coisa aí no meio do caminho você também vai ter que gerenciar isso aí igual el oferece algumas ferramentas que a gente vai falar depois ao longo do vídeo para você poder organizar isso daí então as go routines elas são como se fossem threads e só que não exatamente threads elas são bem menores e são gerenciadas pela Run time do go a Ron time é responsável por executar o seu código quando você gera o binário final então então e threads elas são gerenciadas pelo sistema operacional
tá então a gente tem gor routina gerenciada pela R time E aí a gente tem a Run time rodando no sistema operacional então isso são go routines é você executar funções de maneira concorrente aí no seu programa Pergunta número três Qual a diferença entre uma goroutine e uma thread bom a principal diferença a gente falou né Um pouquinho sobre no na nossa última resposta mas as goroutines elas são como trads só que bem menores e são gerenciadas pela runtime do go a runtime tem várias outras partezinha ali dentes que são responsáveis por gerenciar como seu
código roda no sistema operacional e as trades elas são gerenciadas pelo Kernel do seu sistema operacional Então a gente tem essa diferença eu peguei aqui uma imagenzinha de um artigo bem legal também posso até deixar na descrição do vídeo e mais ou menos como que isso funciona tá a gente tem aqui a runtime do go e ela tá com uma fila aqui de GO rotinas para serem processadas e a gente tem o scheduler do go aqui a gente tem a trad do sistema operacional e a CPU que vai processar né E tem aqui o o
scheduler que é o agendador de tarefas do sistema operacional só que aqui a gente tem o go scheduler e o go scheduler ele vai pegar da minha fila global de GO rotinas vai jogar para uma fila local próximo aí da strad e as threads vão consultar aí essa fila ver o que que tem aí para rodar então gerenciamento de para qual thread vai aqui é quem faz aí é o Gol o scheduler do Gol né para entender Qual é a melhor thread aí como que eu vou jogar a minha goor routine porque ele também consegue
fazer algumas análises para poder Executar a minha goroutine de uma maneira um pouco mais eficiente aproveitando melhor os recursos aí do sistema operacional pergunta número quatro como que eu paro uma goroutine a gente já viu o que que é uma goroutine né a gente entendeu o que que que que ela faz só que como que eu consigo parar Então eu separei até uma imagenzinha aqui para mostrar para vocês para esse caso a gente utiliza os channels os channels eles são aí uma funcionalidade do Gol que a gente pode utilizar pra comunicação entre go routines quando
as go routines elas precisam se comunicar Por exemplo essa routine aqui precisa enviar o valor para essa daqui e ela vai receber esse valor e vai fazer um processamento com esse valor a gente utiliza o Channel e aí quando a gente precisa parar uma gor routine a gente tem que enviar algum tipo de sinal aqui nesse Channel para que essa outra aqui ou essa daqui ou as duas Parem de processar e como que a gente faz isso já deixei um código aqui separado a gente cria um Channel assim ele é um tipo implícito aqui na
linguagem tá então esse daqui é o é o Channel e ele é um boleano Então ele pode receber o true ou false esse defiro aqui é porque eu fecho esse chum quando o meu a minha meu ma aqui minha gor rotina principal que tá dentro desse M termina de ser executada Então eu preciso fechar um canal para ele não receber mais mensagens e não dá nenhum pepino depois de memória e é assim que eu começo uma go rotina em go uma go rotina ela pode ser iniciada com a linguagem go aqui no no começo e
a ele chamam essa função worker passando meu Channel essa função worker ela está aqui e ela recebe um canal E aí ela inicia um Loop Infinito aqui ela fica escutando nesse Loop Infinito se o meu Channel recebeu algum sinal quando a setinha tá desse lado direito quer dizer que eu estou lendo do meu canal quando essa setinha tá do lado direito ô gente eu confundi direito quando a setinha tá do lado esquerdo significa que eu estou lendo no meu canal quando ela tá do lado direito significa que eu tô escrevendo nele então aqui dentro desse
for eu estou lendo tá o meu canal Então se em algum momento ele vir true né porque aqui o if quando eu não coloco asserção nenhuma nativamente tô comparando como true ele vai fazer um Break aqui no meu for vai sair disso daqui então aqui eu inicio uma go rotina aqui eu conto 2 segundos tá essa função time ela trava a minha gor rotina principal que é o tá ela é minha gor rotina principal essa daí ela imatel imorrível sei lá eu não posso matar mas aí dentro dela eu crio várias outras pequenas que é
essa worker aqui por exemplo e aqui eu travo ela por 2 segundos depois que ela é travada por 2 segundos eu escrevo no meu canal o valor true né então lembra que eu falei a setinha do lado direito significa que eu tô escrevendo assim assim que eu escrever aqui essa função vai ler e quando ela ler ela vai parar e aí quando ela parar ela vai printar aqui goor routine encerrada Tá então vamos executar aqui envia o sinal por eu devia ter colocado esse em cima né deixa executar de novo ó e vai enviar o
sinal por 2 segundos e depois go routine encerrada se eu não tivesse essa comparação aqui ela ficaria rodando eternamente E aí eu travaria aqui meu servidor dá ruim deixa até copiar mas perf é isso eu gosto muito de utilizar esse goplay Tools aqui para fazer testes rápidos com a linguagem é bem legal então é assim que você para uma go routine você manda um sinal por meio de um canal E aí você tem que ter uma lógica dentro da sua função go routine é que vai fazer com que ela pare e aí você para esse
canal e depois você tem que fechar ele Para não acontecer mais nada e não deixar nenhum canal aberto que não tenha é nenhuma go rotina utilizando ele para se comunicar quinta e última pergunta por que que não é recomendado utilizar variáveis globais com goroutines bom vocês viram aí nas nas nossas explicações anteriores que eu consigo rodar goroutines né Elas são a execução aí de várias funções de maneira concorrente e se elas acessarem a mesma variável para fazer algum tipo de operação Pode ser que a gente tem um problema muito famoso e conhecido chamado Race condition
uma condição de corrida que é quando várias funções aí várias gor rotinas tentam acessar ou escrever é no endereço aí de memória ao mesmo tempo alterar o valor de de alguma coisa então vou mostrar aqui para vocês o exemplo de código de uma Race condition e aqui a gente tem a nossa variável Global geralmente em programas go tá essa primeira letra aqui é maiúscula mas a gente tá só usando esse exemplo aqui no arquivo só para ver e aí a gente tem a função incremente que ela vai fazer uma iteração até chegar a 1000 né
quando for menor que 1000 e vai somar o valor dessa variável aqui a gente tem incremente dois que vai fazer a mesma coisa só que vai somar com três e aqui a gente tem incremente três que vai atribuir o valor de zero para aquela variável E aí a gente tem é um slip aqui de 1 segundo para esperar executarem no exemplo anterior vocês viram a gente usa muito slip para travar pra execução do sistema não descer aqui para esse Print então o tempo que a gente definir ele vai ficar travado aqui e isso aqui vai
ficar processando aí de uma maneira concorrente tá aqui a gente tem um exemplo como que vai acabar vamos ver acabou com zero mas eu vou ficar rodando aqui várias vezes tá PR a gente vê ó do nada deu 4.000 eu rodei mais duas vezes o sistema E aí ele mudou né o o valor que é para vocês verem que tipo assim não tem uma ordem pras gor rotinas rodarem elas rodam do jeito que dá no sistema operacional só que esse é um caso de Race condition e olha lá quando não dá um problema de algum
conflito aí então acabo tendo um valor aqui que não é muito confiável E aí go Ele oferece algumas outras alguns cursos para vocês lidarem qu e resolverem esse tipo de problema um deles é o mutex no qual eu consigo travar esse valor aqui né enquanto eu tô mexendo nele ninguém aqui que for tentar acessar vai conseguir eu tenho até um tem até um exemplo aqui no goplay Tools desse mutex mas eu não vou entrar e em detalhe dele mas o mutex é esse pacote aqui o syn mutex então ele até usa o exemplo aqui da
Go rotina ó e aí a gente faz um Lock e um Lock desse só depois que a gente mexe no no valor da variável aí que a gente tá mexendo então ele é utilizado desse jeito no caso do exemplo anterior esse locking Lock eles ficariam deixaria aquela variável contador aqui o Counter no meio e aí nenhuma outra goroutine conseguiria acessar um outro jeito de resolver é utilizando channels que a gente já viu aqui eu lembro que a gente ficava esperando um sinal da nossa gotina para poder parar ela a gente também pode acessar o valor
dela na função que a gente tá precisando e não ficar toda hora alterando sim recebendo valor e fazendo o que tem que fazer na função principal Essas são umas duas opções aí que vocês podem resolver esses casos e por isso que não é recomendado você utilizar uma variável Global né para fazer algumas operações dentro de GO rotins bom eu espero que você tenha gostado Essas foram cinco perguntas aí que caem entrevista para pessoas desenvolvedoras go depende aí do nível né se é uma pessoa mais júnior uma pessoa um pouco mais intermediária mas essas perguntas também
serviram aí pra gente aprender um pouco mais sobre a linguagem né e o o forte dela que o pessoal vende muito que são as goroutines e concorrência bom eu fico por aqui eu espero que você tenha gostado e até a próxima [Música]