Um momento
Aula 58
Cursos / Aprenda Go / Golang (Curso de Programação)
Como Criar um Método com Ponteiro Receptor para Modificar os Dados Originais

Summary

Resumo da Aula sobre Ponteiros Receptores na Linguagem Go

Nesta aula, continuamos nosso aprendizado sobre métodos na linguagem Go, focando especificamente em ponteiros receptores.

Estrutura de Dados

  • Temos uma estrutura chamada Pessoa, que possui duas propriedades: nome e sobrenome, ambas do tipo string.
  • Criamos um método nomeCompleto que utiliza um receptor p do tipo Pessoa, permitindo o acesso às propriedades nome e sobrenome.

Modificação de Propriedades

  • Foi proposta a criação de um método capitalizarNome, que modifica a propriedade nome da estrutura Pessoa, convertendo todas as letras para maiúsculas.
  • Para isso, usamos a função strings.ToUpper do pacote strings, que requer a importação no início do arquivo.

Problema da Cópia

  • Ao chamar capitalizarNome, observamos que a modificação não afetou o objeto original. Isso ocorre porque o receptor é passado por valor, ou seja, uma cópia do objeto é feita.

Solução: Receptor de Ponteiro

  • Para modificar o objeto original, transformamos o receptor de valor em um ponteiro, adicionando um asterisco antes do tipo no método:
    func (p *Pessoa) capitalizarNome() {
        p.nome = strings.ToUpper(p.nome)
    }
    
  • Assim, quando chamamos capitalizarNome, a modificação acontece diretamente na instância que chamou o método.

Resumo Final

  • Receptor por Valor: Faz uma cópia do objeto, e modificações afetam apenas a cópia.
  • Receptor de Ponteiro: Permite modificações diretas no objeto original.
  • Para usar um receptor de ponteiro, basta adicionar um * antes do tipo na definição do método.

Concluímos a aula entendendo a diferença entre receptores por valor e receptores de ponteiro em Go. Até a próxima aula!

Video Transcript

Olá a todos vamos continuar o nosso aprendizado de métodos na linguagem Go. Vamos falar nessa aula de ponteiros receptores. Então vamos dar mais uma olhada no receptor. Nosso exemplo aqui temos uma estrutura pessoa que tem duas propriedades nome e sobrenome, ambas do tipo stream. Criamos um receptor chamado nome completo, a função chamado nome completo que é o método que usa o receptor p. O receptor é esse cara aqui, o método é chamado nome completo. Então receptor p nos permite acessar propriedade nome e sobrenome daquele que chama o método. Nesse caso alguém que referência o método nome completo faz a chamada. Agora vamos aprender sobre essa parte aqui. Note que nós escrevemos p seguido o nome do tipo, nesse caso track. Note que os métodos podem ser adicionados a qualquer tipo que você crie, não precisa ser necessariamente só a struct. Qualquer caso vamos continuar aqui, vamos supor que temos uma função que vai modificar o nome, propriedade nome e vai capitalizar todas as letras. Vamos só criar essa função aqui e defini-la como um método para ver no que dá. Aqui em baixo, depois da declaração e definição, do nome completo vou criar outro método, como é que faz um método. O método é uma função que tem entre o nome da função e a palavra chavefunk, tem aquele cala-lista de receptores. Vamos fazer da mesma maneira, criar a lista de receptores, eu vou chamar essa função capitalizar nome. Essa função não vai ter nenhum parâmetro porque a gente vai usar o receptor p aqui, p do tipo pessoa. Essa função vai fazer o que? Se a gente quiser, pode retornar o nome capitalizado ou não? Nesse caso aqui eu não vou retornar nada, tá? Vou tentar modificar o nome da pessoa. Vou falar assim p ponto nome igual a, vou capitalizar todas as letras. Para poder fazer isso, vou usar o método 2u, que dá pacote strings, então strings.2u significa para maíuscula, letra maíuscula. Para poder usar os strings, eu tenho que importar lá em cima. Vou adicionar as strings ao import. Vamos ver aqui no que dá. Em vez de chamar o nome completo aqui embaixo, vou depois do nome completo, na verdade vou chamar fmt println. Antes do nome aqui, vou capitalizar nome. Vou dizer alguém ponto capitalizar nome. Se nós chamarmos capitalizar nome, esse novo método que criamos, na instância alguém, alguém, uma estrutura que definimos literalmente com o nome de zé. Ele vai chegar aqui, o p vai ser o valor apareciado pelo alguém, que vai ser esse aqui na linha 22, pessoa de zé. Vai dizer p ponto nome igual strings.2u vai converter todos esses caras aqui para maíuscula, dessa maneira aqui. Mas será que vai funcionar? Essa é a questão. Vamos ver se vai funcionar. Vamos aqui ao terminal. O nome do arquivo é método 3, o novo arquivo que eu criei, duplicado dos outros. Ah, desculpa. Eu esqueci de fazer uma coisa. Os strings.2u requerem um argumento, qual esse argumento vai ser o p ponto nome, se não tem nada para converter para maíuscula. Então os strings.2u levam o argumento, aquilo que você quer aqui, seja convertido, os caracteres que você quer, seja convertido a letra maíuscula. Tentei colocar p ponto nome aqui como argumento. Vamos tentar novamente. A note que chamamos capital Z a nome, depois dêmos o nome completo, mas note que o juzé ainda está da maneira que foi escrita e não tem a capitalização. Não está em letra maíuscula, por que será? Aqui o que acontece é o seguinte, esse receptor é o receptor de valor. Isso significa que quando você passa, quando ele passa o alguém aqui como receptor p, ele passa uma cópia. Não é uma referência direta. Então a cópia de p é passada, essa cópia, o nome da cópia realmente muda para a porquê, para maíuscula. Se você deve meter println aqui dentro de capitalizar a nome, eu vou dar o printf, na verdade, printf, e vou dar o percentual, esse aqui, vírgula, com o p ponto nome, para ver se realmente modificou. A note que eu esqueci da barra n para adicionar a nova linha. Note que dentro de capitalizar nome, o juzé está com letra maíuscula. Então realmente modificou o p ponto nome, mas o da cópia, que é o p. P pessoa aqui dentro dos corpos de capitalizar nome, mas lá fora, o alguém que ele chamou, é outro, a outro instância. Por isso não funcionou, ficou na mesma. Agora, para a gente não passar a cópia, em vez da cópia queremos modificar o original. Para poder fazer isso, temos que converter o nosso receptor de valor para o ponteiro. O ponteiro receptor. Em inglês pointer receiver. Para poder modificar isso, é só adicionar o arxiterisco antes do tipo aqui. Então, vou dizer, arxiterisco pessoa, isso significa um ponteiro para uma pessoa. Vamos rodar de novo para você ver que o negócio mudou. Capitalizar o juzé dentro de capitalizar nome, e também lá fora. O alguém se tornou, o nome de alguém se tornou letra maíuscula. Devido ao ponteiro receptor, arxiterisco pessoa lá. O aquele que referência o p, o alguém foi modificado. Receptou o original modificado. Note também aqui que embora que alguém não seja um ponteiro, porque ele espera que o receptor seja um ponteiro para uma pessoa. Embora que alguém seja, na verdade, um valor, não é um ponteiro. Se fosse ponteiro, seria o quê? Nós teríamos que dar o endereço, pegar o ponteiro. Dessa maneira endereço dessa alguém e passar ele aqui para poder chamar o capitalizar nome. Então, o que acontece aqui é que o gol vai interpretar coisas sem você precisar fazer essa botada, o 1% e essas coisas. Não precisa se preocupar com isso. Você pode passar um valor como alguém que esse valor vai funcionar, nem que seja um ponteiro receptor ou ponteiro de valor. Vamos revisar o que a gente aprendeu aqui. Aprendemos a criar um ponteiro receptor. Isto é, se você não tiver o asterisco lá antes do tipo do receptor, ele vai pegar e fazer uma cópia do receptor. Com uma cópia, você pode modificar os propriedades da cópia, nesse caso, da struct. Mas o que acontece é que lá fora, aquele que chamou o método, não vai ser modificado. Para poder a gente modificar o original, precisamos adicionar o asterisco antes do receptor para poder torná-lo um receptor de ponteiro. Por essa aula é só. E até a próxima. Tchau!
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: