hoje é o dia que você vai entender o que você precisa saber sobre ponteiros na linguagem go Mas além disso eu vou mostrar para você uma novidade que tá aí para sair na versão 1. 24 da linguagem que são os famosos Wick pointers ou ponteiros fracos então roda a vinheta porque a gente tem bastante coisa para falar hoje Olá pessoal tudo bem seja muito bem-vindo e muito bem-vindo a mais um vídeo aqui no canal full pych meu nome é Wesley Williams e hoje a gente vai falar sobre um assunto que muitas vezes mexe com a cabeça das pessoas principalmente quem tá começando com gol ponteiros na realidade é uma dúvida que bastante gente tem principalmente inclusive na época que você tá na faculdade e começam a mostrar para você como é que funcionam os ponteiros no c e tudo mais além disso mesmo quem já trabalha com gol Às vezes tem algumas dúvidas sobre esse assunto mas eu acho que o ponto mais importante desse vídeo hoje é a novidade que tá para sair na versão 1. 24 da linguagem onde você tem uma outra opção para você trabalhar com ponteiros para conseguir economizar um bocado de memória na sua aplicação Então vamos nessa mas antes de gente ir direto o assunto queria muito pedir para você dar um like nesse vídeo tá a se inscrever no canal e ativar os notificações assim sempre quando o vídeo topico nem esse for pro Ar você vai ser notificado ou notificada também tá Ah eu queria dizer que aqui na full pych a gente tem diversos cursos e pós-graduações tá inclusive sobre a linguagem go a gente tem uma pós--graduação chamada go Expert que tem tudo que você precisa saber para começar com gol do zero mas também para você aprender diversos recursos avançados até o funcionamento interno da linguagem então se você tem interesse clica no link que eu tô deixando aí abaixo tá para que você possa se inscrever bater um papo com a gente a gente vai ver se faz parte do seu momento profissional E aí eventualmente você pode fazer com a gente sem compromisso clica aí no link mas galera seguinte chega de delongas vamos falar então sobre ponteiros na linguagem Gol eu quero trazer uma abordagem bem prática aqui para vocês e a gente também vai avançar pros we pointers que tá sendo para lançar aí na versão 1.
24 então vamos aqui pra tela do meu computador pra gente trabalhar em cima disso deixa eu aumentar mais zoom aqui para ficar melhor para vocês Bom seguinte pessoal Ah vamos fazer uma revisão básica sobre ponteiros né o o grande ponto referente a ponteiros no final das contas é como que você quer armazenar as variáveis que você cria durante o programa quando você tá criando um programa né ah você tem dois locais onde os dados acabam ficando armazenados na memória nós temos um local onde a gente chama de stack e outro local que a gente chama de hiip a stack normalmente ela fica em funções tá ou classes ali que ficam retornando dados no formato de uma pilha Ou seja eu tenho uma função que retorna O valor uma função que chama uma outra função que chama uma outra função elas vão sendo empilhadas conforme uma vai retornando a outra vai retornando Essa stack ela vai diminuindo Ah até ela ficar limpa né quando essa steack cresce muito a gente tem aquele famoso termo stack overflow na realidade Essa é a forma eu acho que mais baixa e simples que eu posso explicar rapidamente né em 2 minutos para você como é que isso funciona por outro lado Existem momentos na sua aplicação onde os dados que você está trabalhando eles são compartilhados com outras partes do seu programa E aí nesse caso você não consegue a armazenar esses dados na stc porque outros locais precisam saber que estão fora daquela pilha E aí nesse momento é o local onde você aloca a memória de forma dinâmica Ou seja você precisa de um valor esse valor é colocado na memória a do seu computador e daí você pode acessar esse valor de diversos locais da sua aplicação tá e para que que servem os ponteiros os ponteiros na realidade Eles são um apontamento para aquele local na memória então eu vou mostrar isso aqui para vocês de uma forma bem simples e rápida vamos imaginar que eu tenho a variável a que é igual a 10 aqui para mim legal o que que acontece se eu criar um ponteiro aqui então vou colocar aqui ó ah ponteiro tá Ah de inteiro é igual a a o que que isso aqui significa na prática tá isso significa que a variável nesse caso que é um ponteiro e como que eu indico que essa variável é um ponteiro colocando um asterisco aqui na na frente dela então como o ponteiro ele é apenas um apontamento a paraa memória eu preciso colocar que o valor dele nesse momento na idade é uma referência ou seja o o endereço da memória onde aquela variável está armazenada nesse caso aqui é quando nós usamos o e- comercial a o e- comercial e nesse caso o nome da minha variável que é a então quando eu falo que a É iG 10 eu estou falando da atribuição do valor 10 pra variável a quando eu falo que a tem um e- comercial aqui na frente que nesse caso a gente tá tá trabalhando com ponteiro eu tô falando que esse carinha aqui ele simplesmente né aponta pro local da memória onde o a o valor de a está armazenado quando eu falo o endereço da memória é um endereço mesmo aonde essa variável ela fica gravada eu vou dar um exemplo aqui para vocês só para vocês terem uma ideia a memória ela funciona como se fossem gavetinhas cada gaveta tem um endereço e dentro desse endereço tem um valor então o ponteiro nesse caso ele aponta para endereço é como se fosse uma Mailbox é como se fosse uma caixinha de correio que eu falo olha o número da sua caixinha é essa Toda vez que você precisa pegar vai nessa caixinha Então nesse caso Olha o que eu vou fazer eu vou imprimir aqui para mim né o meu ponteiro então se eu chegar agora aqui dar um go Run pointers Main P go você vai perceber que a minha aplicação nesse caso né ela tá indo esse valor aqui o que que significa esse valor no final das contas é o local né o número o endereço na memória onde esse valor 10 está guardado tá então esse aí é o principal ponto que você tem que entender sobre ponteiros o ponteiro ele manda o endereçamento da memória onde você precisa mas para que que isso serve na prática tá o que acontece é o seguinte no meu computador eu posso ter diversos locais onde eu posso querer modificar né o valor de a ou seja o valor onde né o a está armazenado nesse momento mas o a é uma variável que tem um apontamento né nesse caso aqui para esse local da memória mas o que que pode acontecer com isso agora eu posso por exemplo chegar aqui e fazer o seguinte eu posso colocar que o ponteiro agora é 20 O que que significa Esse asterisco na frente ele tá fazendo uma deferência basicamente o que ele tá fazendo é o seguinte agora né pegue o valor da memória onde esse ponteiro está apontando né E mude o valor para 20 O que que significa aqui significa que se eu imprimir agora o valor a você vai ver que o valor dele mudou para 20 então isso significa o quê na realidade que mesmo eu sem alterar o valor de a quando eu peço pro meu ponteiro a atualizar o valor que está nesse endereço de memória significa que eu estou alterando o valor de a porque o a né está gravado nesse endereço o ponto mais interessante aqui também é o seguinte se eu fizer assim ó B dois pontos igual a a isso aqui é basicamente a mesma coisa significa que eu tô falando para a minha variável B que ela é um apontamento pro a o go ele consegue inferir já que se você tá colocando um endereço de memória você tá falando de um ponteiro Então significa nesse momento se eu chegar aqui B é igual a 30 e se eu imprimir o a ainda olha só que interessante o a vai ser 30 na prática isso aqui ajuda a gente para caramb por quê imagina que você tem uma variável que ela tá sendo utilizada em diversos locais do seu do seu sistema né mas o grande ponto é que quando você tá trabalhando com essas variáveis por exemplo dentro de uma função por exemplo essa variável por padrão ela feita uma cópia uma duplicação Isso significa que mesmo você fazendo essa alteração essa alteração ela não vai refletir na variável original imagina que eu tenho essa situação aqui ó eu tenho mais struct aqui de pessoa Opa Type pessoa struct né elá vai el aqui certo e aqui eu dou um name que é uma string legal e agora aqui eu venho e crio um método chamado a Change name onde eu vou passar uma string e eu vou falar que o valor do nome é esse aqui então se eu chegar agora e imprimir o valor do meu nome tá então vou colocar aqui ó p. name agora aqui qual é o valor que você aa que vai acontecer aqui nesse momento Então vamos fazer isso rapidinho antes da gente entrar no ponteiro fraco tá basicamente eu colar P igual Lucas Se eu colocar a p. name eu vou ter o resultado de João Então vamos lá tá aqui o João show de bola mas olha só que interessante aqui para mim se eu chegar agora aqui no p e falar p.
name adivinha o valor que vai aparecer aqui para mim olha só ele vai voltar com o valor de Lucas por quando eu fiz que p. name é igual a name ele pegou o valor de name aqui e duplicou aqui dentro desse método Então nesse o valor de name está alterado mas no escopo global aqui aonde tem a minha stru original né o name ainda está como Lucas tá Então essa é o funcionamento básico de como que o go funciona monte de linguagem funciona agora Como que eu faço para que quando fizer p. iG alterar o name original se eu coloco esse estou aqui como um ponteiro Isso significa que quando eu tô dando um p.
name iG name ele tá pegando o endereço na memória onde o p está armazenado trocando esse atributo nome pelo valor que eu tô passando aqui aí toda vez que eu fizer essa alteração ele vai mudar o o nome original porque nesse caso esse P aqui tá representando o endereço na memória onde pessoa né esse objeto ele está armazenado Então nesse caso se eu rodar aqui pra gente você vai ver que eu tenho João e João agora porque esse meu P pname mudou né o endereço mudou no local naquele endereço de memória o valor original Então essa é um resumo bem básico sobre ponteiros tá agora o grande ponto que nós temos falando com ponteiros é que esse tipo de apontamento aqui é um apontamento forte Tá o que que isso significa significa que enquanto eu tiver uma variável né ou um ponteiro apontando para aquele endereço na memória quando o meu garbage collector passar para fazer varreduras né e remover e fazer liberação de memória né o que que vai acontecer ele não vai limpar aquele endereço na memória porque ele entende que aquele endereço está em uso porque eu ainda tenho um apontamento para lá o garbage collector ele verifica em vários locais do seu programa se eu ainda estou usando aquele endereço da memória como que ele sabe se eu tô usando se eu tenho apontamentos se ele vê que eu não tenho apontamento o garbage collector passa lá e faz a liberação de memória para mim ok agora olha só que interessante imagina que eu estou numa situação onde eu ainda tenho um apontamento forte a pra minha memória logo o meu garbage de collector não vai fazer uma limpeza então vamos aqui nesse outro arquivo somente para conseguir dar um exemplo concreto aqui para você tá então vamos fazer o seguinte vamos imaginar que eu tenho aqui a minha struct com um valor de v aqui para mim beleza então eu vou fazer o seguinte eu vou criar uma variável chamada data aqui para mim esse data perceba que eu já tô declarando ele um valor e esse cara aqui já é um apontamento na memória beleza agora olha só que eu tenho eu tenho uma variável chamada strong ref dois pontos igual a data nesse momento aqui eu tenho o data apontando para esse local da memória e eu tenho esse strong ref também apontando para esse local na memória Ou seja eu tenho dois apontamentos pro mesmo local onde essa struct está sendo armazenada Beleza agora o que que eu vou fazer nesse momento eu vou pedir pro garbage collector passar aqui de uma forma forçada PR mim então vou dar um runtime p GC e o garbage collector vai passar que eu fazer aqui também para mim eu um time P slip e esperar um segundo só ter certeza que o me garbage collector ele passou nesse momento e agora o que que eu vou fazer eu vou chegar aqui e vou imprimir FMT print LN e vou passar a minha referência forte o que que vai acontecer nesse momento se eu dar um go run ah aqui Wi main. go ele vai imprimir aqui Ah Lucas opa pera um pouquinho ah tá certo V é igual a Lucas Beleza então ele vai imprimir Lucas maravilha aqui para mim agora olha só que interessante aqui nesse caso se eu chegar aqui e liberar o valor de data eu falar assim data é igual a new que que vai acontecer Ele ainda está imprimindo Lucas mesmo que o garbage collector ele tenha passado por qu Apesar de eu ter zerado e colocado um zero value aqui no meu valor de data a minha referência do meu strong he ainda é forte para esse endereço na memória Então significa que o Garbage colle Apesar de eu ter zerado data aqui nesse momento ele não vai liberar esse valor na memória porque eu ainda tenho uma referência forte aqui para mim então esse aí é um ponto importante que eu queria que você compreendesse nesse momento agora vamos imaginar que eu estou numa situação que eu preciso Ah fazer o seguinte eu quero ter mais flexibilidade eu posso criar alguns apontamentos que nem eu fiz aqui mas se eu zerar essa minha variável data esses apontamentos eles também vão desaparecer e daí a memória ela é limpa ali pra gente Então nesse nosso caso eu vou mudar aqui essa minha eu vou só para semanticamente ficar certo Eu Vou Chamar esse cara aqui de Wick Pointer e agora ao invés de eu fazer esse apontamento direto dessa forma o que que eu vou fazer eu vou chamar de Week pon me e vou colocar o data aqui para mim o que que isso significa nesse momento significa que eu criei um apontamento normal aqui pro data mas quando eu coloco esse we. make eu tô dizendo o seguinte crie esse apontamento mas ele esse apontamento ele é fraco significa que se o data for Zerado esse apontamento vai indicar que ele também pode desaparecer e aí a memória vai deixar de ter ter apontamentos para ela e o garbage collector vai poder fazer a liberação Como que eu consigo fazer uma verificação aqui só pra gente não ter a Um erro bobo eu posso fazer o seguinte if a Wick Pointer ponto velo legal aqui para mim for igual a nul eu vou colocar aqui ó data is gone Beleza então Então vamos ver o que que acontece com a gente nesse tipo de situação eu vou colocar ou vou F assim ó Ou posso colocar data ainda tá sendo utilizada Então vou rodar esse cara e aqui tá data is gone O que que significa que o garbage collector passou viu que a gente Ah quer dizer o programa rodou eu zerei o data o meu programa percebeu que esse apontamento é é fraco pro data logo quando zerei o data esse apontamento acaba sendo perdido o garbage collector passa faz a limpeza na memória logo esse apontamento vai embora realmente e aqui eu pergunto existe alguma coisa aqui nesse ponteiro ainda ele vai falar que não então data is gone caso caso contrário o o dado ainda vai tá aqui se eu mudar esse esse esse apontamento normal aqui ó se eu colocar tirar o velho aqui aqui nesse caso Olha o que vai acontecer eu tenho ainda um apontamento forte então o dado ainda está ali mas quando eu mudo para um apontamento fraco o dado foi embora Então essa é uma forma de você criar apontamentos E no momento que você quiser garantir que você vai fazer a liberação de memória Você fica muito mais tranquilo e você tem um controle mais granular quando que você pode usar isso quando você quer realmente criar programas que eles fiquem com mais memória ah sendo otimizada mais memória sendo liberada Obviamente você tem que conhecer cada vez mais as nuances da linguagem para conseguir fazer esse tipo de utilização mas isso aqui é um recurso realmente muito útil para você ir explorando ao longo do tempo show de bola galera Essa é a ideia principal de como funcionam os ponteiros fracos Eu aproveitei e também dei uma passada geral aí de como que funcionam os ponteiros no gol Eu espero que você a tenha gostado desse vídeo ele na minha opinião Ele é bem útil principalmente para quem tá começando com ponteiros quem já conhece e ainda quer explorar um pouco mais com essa novidade na versão 1.
24 no momento que eu tô gravando esse vídeo o gol está na versão 1. 23 e a versão 1. 24 tá no release candidate 2 então não gerou ainda a versão 1.