Receptor de Valor vs Ponteiro - O Valor da Chamada no Método vs Argumento de Função
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.