Um momento
Aula 59
Cursos / Aprenda Go / Golang (Curso de Programação)
Receptor de Valor vs Ponteiro - O Valor da Chamada no Método vs Argumento de Função

Summary

Resumo da Aula sobre Métodos em Go

Nesta aula, o foco é o aprendizado sobre métodos na linguagem Go, com ênfase em ponteiros e receptores. Aqui estão os principais pontos discutidos:

Ponteiros e Receptores

  • Método capitalizarNome: Foi criado para modificar o nome do receptor original de forma a capitalizar todas as letras. Um ponto importante é que mesmo quando o receptor não é um ponteiro, a chamada do método ainda funciona.

  • Diferença entre Método e Função:

    • Criação de uma função capitalizarNome que aceita um ponteiro como parâmetro.
    • A chamada da função falha quando um valor é passado, já que espera um ponteiro, ao contrário do método que lida automaticamente com o valor.

Comportamento do Go

  • Conversão Automática: Quando um método é invocado em um valor, Go automaticamente o converte para um ponteiro no caso do receptor ser um ponteiro. Assim, alguém.capitalizarNome funciona mesmo quando alguém é um valor.

  • Receptor do Valor: Se uma função (não método) espera receber um valor e você passa um ponteiro, ocorrerá um erro, pois Go não faz essa conversão para funções.

Exemplo Concreto

  • Discutido um exemplo de um método nomeCompleto que espera um valor, e como passar um ponteiro para esse método funcionará devido à conversão implícita.

  • Ressaltada a diferença quando se tenta usar uma função normal, onde não ocorre a mesma flexibilidade que nos métodos.

Conclusão

A principal lição é que Go permite uma flexibilidade adicional em chamadas de métodos, fazendo uma conversão automática que não acontece com funções normais. Isso pode simplificar o uso de métodos em sua programação, mas é essencial compreender como e quando isso acontece.

Até a próxima aula!

Video Transcript

Vamos continuar aprendizado de métodos na linguagem Go. Vamos falar mais um pouco de ponteiros e receptores, só pra ver mais detalhes que acontece. No exemplo anterior criamos o método capitalizarNome pra poder modificar o nome do receptor original pra poder capitalizar todos os leis do nome e modificar o original, nesse caso alguém que chama o método capitalizarNome. Vamos falar da chamada do método e de quem está chamando o método, porque você note que nesse caso alguém é um estrutura literal, não é um ponteiro. Mas note que alguém, embora seja um valor, chama o capitalizarNome embora que o receptor seja um ponteiro. Normalmente, se você tivesse uma função normal com alguns argumentos e parâmetros, isso não seria possível. Vamos criar a versão que não é método do capitalizarNome. Vou dizer funk, função, capitalizarNome. E como um parâmetro, vou dizer p e acho que estaria esse pessoal um ponteiro pra uma pessoa. Vai ser aquela mesma coisa, só pra viaí colar aqui dentro de função, capitalizarNome. Se quiser deixar esse log aqui ou não, não precisa. Vou tirar comentar a linha 29 e vou dizer função capitalizarNome e vou chamar como alguém como argumento. Note que alguém é um valor, mas o parâmetro espera que seja um ponteiro. Vamos ver se funciona. Voltando ao terminal, vou dar go run method 4, criar um novo arquivo. Note que o compilador fala que tem um erro na linha 30 dizendo que não pode usar alguém do tipo pessoa, porque ele não é o ponteiro pra pessoa que foi esperado pela função, função, capitalizarNome. Então, não funciona se tiver só a função por si só. Mas se tiver como método, como a gente tinha antes, o alguém nesse caso não é ponteiro, mas ainda que não seja ponteiro, ele funciona aqui normalmente. Por que será que isso acontece? Não deu erro, olha aqui. Porque o go ele vai interpretar isso e vai ser automaticamente lidar com esse caso. Isso só funciona se for pra método, tá? Você pode ter um método, um receptacle que seja de ponteiro ou de valor e na chamada você pode passar ponteiro ou valor e ele vai funcionar. Nesse caso, o que é que o go faz? Você tem alguém aqui. Quando você chama alguém.capitalizarNome, é o equivalente do go vai adicionar o ampersand pra poder pegar o endereço que é referente a valor de alguém. E ele vai fazer essa maneira.capitalizarNome. Isso que ele faz. Se você rodar, ele funciona da mesma maneira. Tá? Entendeu? Agora o investo também funciona se a função ou o receptor for de valor e você passar um ponteiro na chamada aqui. Por exemplo, vamos ver aqui. Vamos ver o nome completo. No nome completo, espera um receptacle seja valor. Mas se eu criar aqui embaixo, deixa eu comentar isso aqui. Se eu pegar alguém, tá? E depois alguém é um valor. Eu vou criar uma variável chamada p que vai ser o endereço de alguém. Isso vai ser um ponteiro para pessoa, né? O arxteris pessoa. Nesse caso vai ser ponteiro. Se eu pegar o p e dizer p.nome completo, por exemplo, eu vou pegar e recortar e colar dentro do print. Vou duplicar o println aqui, vou comentar. Vou adicionar isso aqui. Olho na linha 33. P é um ponteiro. Mas ele tá sendo passado aqui com o receptor. No nome completo, mas ele espera que seja um valor. Mas isso vai funcionar porque o gol vai fazer um negócio de interpretar isso para você. Então o que acontece aqui? Ele vai pegar e fazer o seguinte. Como o p é um ponteiro, mas o receptor espera que seja um valor, o gol vai pegar e vai referenciar o ponteiro dessa maneira aqui com o arxteris p. Então ele de referência, né? De referência. E pega, esse cara vira um valor, esse valor passa para o nome completo como receptor p pessoa. E não vai ter problema. Certo? Agora você não precisa falar explicitamente, mas o que o gol faz para você é mais importante você entender o que está acontecendo. Note que se tivéssemos uma função sem ser método para o nome completo, deixa eu definir aqui em senior funk, função nome completo, como a gente já tinha feito antes, level com parâmetro p pessoa, retorno string, pode ser a mesma coisa. Se a gente chamar essa função e passar um ponteiro, não vai funcionar porque o argumento tem que ser valor. Olha aqui. Se eu falar, pego o ponteiro e falar função, nome completo, passar o p, que é um ponteiro, vamos ver se funciona. Não funciona, não pode usar p, porque é do tipo arxteris p pessoa, que é um ponteiro. E o argumento esperava ser um valor, uma pessoa, sem arxteris. Então, não funciona se for só função por si mesmo. Só funciona esse caso que temos o método com receptor. Você pode ser de ponteiro, referência ou pode ser de valor. Não importa e na sua chamada você pode chamar com valor, com ponteiro e o gol vai fazer aquele negócio que a gente aprendeu para você. Está certo? Fui essa aula é só. E até a próxima.
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: