Um momento
Aula 64
Cursos / Aprenda Go / Golang (Curso de Programação)
Valores de Interface no Golang (Interface values) Exemplo - Potencia

Summary

Aula sobre Interfaces em Golang

Introdução

Nesta aula, continuaremos nosso aprendizado sobre interfaces na linguagem Golang. Vamos trabalhar com um novo tipo que representa números inteiros e implementar um método para elevar esse número ao quadrado.

Criação do Tipo e Método

  1. Declaração do Tipo:

    • Vamos declarar um novo tipo chamado inteiro, que é um alias para o tipo int.
    type inteiro int
    
  2. Criação da Variável:

    • Criamos uma variável num do tipo inteiro e atribuimos o valor 3.
    var num inteiro = 3
    
  3. Implementação do Método quad:

    • Implementamos o método quad para calcular o quadrado do número.
    func (i inteiro) quad() int {
        return int(i) * int(i)
    }
    

Testando o Método

  • Usamos fmt.Println para imprimir o resultado de num.quad(), que deve retornar 9 (3 ao quadrado).

Interface potência

  1. Declaração da Interface:

    • Definimos a interface potência que contém o método quad().
    type potência interface {
        quad() int
    }
    
  2. Implementação Implícita:

    • O tipo inteiro implementa a interface implicitamente, pois tem o método quad.

Trabalhando com Valores de Interface

  • Para demonstrar a funcionalidade, criamos uma variável do tipo potência e atribuimos um valor 3 convertido para inteiro.
var pot potência = inteiro(3)
  • Para verificar o valor e o tipo, usamos uma função que imprime o valor e o tipo da variável interface.

Exemplo de Outro Tipo

  1. Criando um Novo Tipo:

    • Definimos um novo tipo chamado outro, que implementa a interface potência de forma diferente.
    type outro string
    
    func (o outro) quad() int {
        return len(o) * len(o) // Retorna o comprimento da string ao quadrado
    }
    
  2. Uso da Interface:

    • Criamos uma variável do tipo potência do tipo outro e testamos o método quad().

Conclusão

  • Aprendemos a definir interfaces e métodos em Golang, além de implementar a mesma interface em diferentes tipos. Vimos que, embora ambas as variáveis possam ser do tipo interface, o método executado depende do tipo subjacente.

Agradecimento e Encerramento

  • Obrigado por participar e até a próxima aula!

Video Transcript

Olá pessoal, estamos de volta com mais uma lava de Golang. Vamos continuar o nosso aprendizado de interfaces na linguagem Golang. Vamos fazer o seguinte nesta aula. Vamos declarar um novo tipo para poder armazenar o número inteiro. Vamos adicionar o método a esse número inteiro para poder elevar o número ao quadrado. Isso vai implementar a interface que eu vou chamar de potência. Interface potência vai ter um método que é quad que vai elevar o número ao quadrado. Vamos começar com declaração de tipo. Note que normalmente nós adicionamos métodos a estruturas. Mas também podemos adicionar métodos a tipos que não são struct. Por exemplo, o tipo int ou tipo float64. Vamos declarar um tipo type. Esse tipo eu vou chamar de inteiro. O tipo do inteiro vai ser int. Então, é na verdade uma alias. Um alias para int. Para eu poder adicionar um método a esse int. Com esse tipo inteiro int, vamos aqui embaixo e declarar uma variável que eu vou chamar de um no tipo inteiro. Vou atribuir o valor, por exemplo, valor 3. Essa variável chamada não tem tipo inteiro. O tipo inteiro nada mais nada menos é apenas um int. Então, atribui o valor 3. Agora, queremos fazer o seguinte. Aqui embaixo, eu quero chamar esse método chamado quad no num. E esse quad, quando chamar, queremos que retorne o quadrado do número. Nesse caso, o número é 3. Então, vai ser 9. Como fazer isso? Deixa eu dar o fmt println para você ver no terminal depois. Ainda não fizemos isso. Vamos fazer já já. Como eu estou usando fmt, aqui em cima vai importar fmt. Pronto. Então, queremos fazer com que essa linha, linha 12, funcione. Então, eu vou criar um interface aqui só para você aprender type. Vamos fazer interface. Fala primeiro type, depois o nome da interface. Vou chamar a potência. E o tipo vai ser interface desse tipo. E a interface potência vai ter um método que eu vou chamar de quad que retorna um int. Então, vai ser esse aqui. Então, eu só dissonei a interface aqui para demonstrar como implementar um interface. Mas depois a gente vai dar mais um olhado em detalhes. Tem interface, mas não precisar fazer interface aqui para poder adicionar um método quad ao inteiro. Porque a interface não é ligada diretamente ao tipo. A interface é implementada implicitamente sem ser acoplada. Então, vamos adicionar um método quad ao inteiro para que o inteiro implemente a interface potência implicitamente. Vamos lá. Primeiro fala funk. Lista de receptores. Vou chamar i do tipo inteiro. Seguir o nome da função quad. Não tem nenhum argumento. Parameter. Função retorna um inteiro porque eu vou retornar o quadrado do número que foi passado. Então, return i vezes i. Note que o valor do receptor é uma cópia do original porque não tem ponteiro. Então, nem que eu tivesse modificado o i, só iria modificar essa cópia aqui, mas não o original que era neste caso ia ser o nome. Se você quiser modificar o original, tem que adicionar o ponteiro. Qualquer maneira, vamos continuar. Quando você chamar o quad, vai retornar i vezes i. Neste caso, o i é o nome e vai dar 3 vezes 3, que é 9. Vamos lá testar se não tem nenhum problema. Vamos ao terminal. Go, run, interface 2.go, nome do meu arquivo. E deu 9 mesmo. Agora com isso, vamos dar um olhado aqui, mais detalhes de valores de interface. Vamos fazer o seguinte. Deixa as linhas 18 e 19. Eu vou comentar e não esqueça as linhas 18 e 19. Agora vamos focar em um. Vou declarar uma variável. Vou chamar a variável também de o.t e vou definir como tipo potência, que é uma interface. Agora, se eu pegar o pote e botar 3, será que dá certo? Ah, eu esqueci de usar aquele coisa. Eu quero mover a linha 19. E volto para cá. Será que funciona assim? E tem que ser pot. Vamos ver aqui. Ver o 21. Não pode usar 3, tipo int, como está tipo potência, porque o int não implementa potência. Isso é verdade. Quem implementa potência é o inteiro, não é o int. Então, para poder consertar isso, você pode falar inteiro aqui, 3, para converter o inteiro, esse 3, a um inteiro nosso tipo. Não pode usar inteiro, int ai potência, não implementa potência. Entero não implementa potência. É mesmo? Ah, por que será? Porque aqui a assinatura da linha 8 aqui que eu tinha definido era como int em vez do inteiro, por isso ele não implementa. Então, tem esse erro, esse bug que eu criei. Então, a verdade está errado. Uma maneira que você está a fazer é se virar inteiro ou deixar int e aqui na assinatura, converte para int dessa maneira. Aí vai dar outro problema agora. O que está dizendo que não pode usar o i vezes o i do tipo inteiro, mas tem que retornar o int. Como é que a ajeita isso? É só converter aqui no return para int. Pronto, certo? Depois de tanto problema, deu certo. Agora, finalmente, realmente, o inteiro está implementando a interface potência. Anteriormente, estava errado porque eu tinha declarado a assinatura de quad como int, valor de retorno, tipo do valor de retorno, mas na linha 3 eu tinha definido com valor de retorno o do tipo inteiro, em vez de int. Devido a isso, ele não implementou a interface, mas eu consertei isso na linha 13, em vez de retornar do tipo inteiro, retorno do tipo int. Com isso, vai ter o problema do i, a variável i, que é do tipo inteiro. Tem que converter o casting aqui, a linha 14, e falar int seguido dos parênteses de o valor dentro, que é o i vezes o i, que são ambos do tipo inteiro. Converte eles para int e vai dar 9 aqui. Agora, esse pot aqui é um valor de interface, porque potência é interface. Então, normalmente, valores de interface, assim, eles, de acordo com a documentação, você pode pensar como se fosse uma tupla de duas coisas, do valor e do tipo. Então, quando você tem essa variável aqui que é amazendo um valor de interface potência, podemos associa isso a um valor e a um tipo. Nesse caso aqui, quem é um valor? Quando a gente faz na linha 21, um valor seria o 3. E o tipo seria o que? O tipo que implementa interface, nesse caso, o inteiro seria o tipo. Para confirmar isso, vamos fazer o seguinte. Deixe eu definir uma função aqui em cima, descrever. E essa função? Eu vou pegar uma variável. Inter, vou chamar de inter ou inteiro, sei lá, que vai ser do tipo. Vamos fazer potência. Potência, potência. Vou escrever essa função bem simples que leva como argumento um tipo que implementa potência e vou descrever isso somente, fazendo FMT printLn, para mostrar qual é o valor e qual é o tipo. Esse é o que a gente passa, o valor e o tipo. Vamos ver aqui. Na verdade, não quero dar o printLn, quero dar o printF. Eu vou usar o percentual V e o percentual T. O V vai corresponder ao valor da variável potência e o T vai corresponder ao tipo da variável potência. Então aqui embaixo, depois da linha 27, eu vou falar de escrever e vou passar o pot como argumento. Será que me importei o FMT? Sim, lá em cima. Vamos ver aqui, vou dar o go run. Como sempre, eu esqueço da quebra de linha, linha 18, no final, bar n. De novo, só para deixar bonito. Então, olha aqui. Quando passa o pot, que é um variável, que é o valor de interface, e chamamos-o de escrever com o pot como argumento, ele vai ver o valor da variável. Nesse caso, é o 3, que está certo. E o tipo, o tipo vai ser inteiro, porque o inteiro está dentro do pacote main, por isso que ele mostra main.int. Então, esses valores de interface, normalmente, você pode pensar com armazeno valor e o tipo. Nesse caso, 3 e o tipo inteiro. E o tipo é daquilo que implementa a interface. Nesse caso, como associamos esse aqui o inteiro, embora que a variável seja potência, o tipo é inteiro. Está certo. E para terminar aqui, vamos fazer o seguinte. Vamos supor que tem outro tipo que também implementa a interface potência, o quad. Mas, nesse caso, ele implementa quad de maneira diferente. Por exemplo, vou definir um tipo aqui, outro. Pode ser, sei lá, pode até ser do tipo string. E o outro vai adicionar o método quad para o outro. E vou dizer funk, vou falar o outro, quad. E desse quad que eu vou retornar um string, em vez de... Na verdade, tem que ser int, porque a interface quer int. Então, vou fazer o seguinte aqui. Nesse aqui, eu vou só pegar o... Vou retornar, pegar o o, vai ser um string. Eu vou pegar a comprimento da string. E vou multiplicar pelo comprimento de novo. Só para fazer qualquer coisa. Por exemplo, se o outro fosse a, abc, d. O comprimento da string seria 4, porque tem 4 caracteres. Então, 4 vezes 4 seria 16. Então, outro aqui, implementa a interface potência. Agora, quando eu vou aqui e declaro uma variável aqui na... Baixe em main, sei lá, vou chamar out do tipo potência. E vou dizer que out vai ser igual ao que abcd. Agora, quando nós chamamos aqui embaixo, vou dizer afmt println out.quad. Out tem do tipo potência, mesma coisa do pot. Mas, quando a gente chama quad, mesmo nome, ele não vai chamar o quad do inteiro, né? Vai chamar o quad do outro, porque... Temos um string aqui. Na verdade, teria que converter para o outro também. Porque nós definimos o tipo ali, outro como aliás, o alias para o outro. Então, tem que ser assim, desculpe. Então, embora que ambos out e port tenham o mesmo tipo que a potência, interface potência, quando eu chamar o quad aqui do out, vai ser diferente do quad do pod. Quando eu chamo quad do out, vai ser esse aqui. Quando eu chamo quad do pod, vai ser o outro. E esse aqui, desculpa, outro não. Vamos confundir outro com outro. Vai ser esse. Vamos testar aqui, vou também descrever o out. Então, o deus 16, tá? Para o print, alinepot, desculpa, out.quad. E para descrever o out, ele descreveu primeiro como valor, que é a BCD, e o tipo que é outro, main.out. O outro está definindo o pacote main. Tá? Então, vamos concluir nossa aula aqui, aprendemos, definimos interface potência, type, nome da interface, palavra-chave interface. Declaramos um método, assinatura do método quad, que tem como valor de retorno int, tipo int. Declaramos dois tipos, personalizados, um inteiro, que na verdade é o int e outro, que é o string. E para cada tipo, nós implementamos a interface potência, quando foi a definição da função quad, que virou o método. Esse caso para o inteiro, que dá o quadrado do número inteiro, e o do outro, que é o comprimento da string ao quadrado. Tá? E aprendemos que quando, embora que ambas variáveis potem, o valor tem um tipo de interface potência, quando chama quad, vai ser chamar métodos diferentes, porque cada um tem sua própria definição de quad. Tá? Então, se você chamar o método num valor de interface, nesse caso pot ou out, o método ser executado, vai ser o método correspondente a o tipo subjacente da interface, nesse caso aquele que implementa a interface, nesse caso inteiro, que implementa a interface potência para o pot, e o outro, que implementa a interface potência ao out. A pura sala é 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: