Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Type interface

No final do curso usamos o tipo interface para realizar o contrato entre os métodos sacar da conta corrente e conta poupança, porém quando eu fui usar conforme o exemplo (pagar um boleto com cada uma das contas), somente na conta poupança precisei usar o & na variavel da conta, na conta corrente não. Eu dupliquei o arquivo ContaCorrente.go e renomeei tudo para ContaPoupança.

package main

import (
    "fmt"
    "learn-go-banco/clientes"
    cc "learn-go-banco/contas"
)

func main() {
    clienteDionathan := clientes.Titular{Nome: "Dionathan", CPF: "123.123.123.00", Profissao: "DevOps"}
    var contadoDionathan *cc.ContaCorrente
    contadoDionathan = new(cc.ContaCorrente)
    contadoDionathan.Titular = clienteDionathan
    contadoDionathan.NumAgencia = 123
    contadoDionathan.NumConta = 123123
    contadoDionathan.Depositar(8000)

    //poupanca
    contadaMae := cc.ContaPoupanca{}
    contadaMae.Depositar(2000)
    fmt.Println(contadaMae.VerSaldo())

    //interface
    PagarBoleto(&contadaMae, 100)
    fmt.Println(contadaMae.VerSaldo())

    PagarBoleto(contadoDionathan, 1000)
    fmt.Println(contadoDionathan.VerSaldo())
}

// Faz um contrato com os metodos iguais
type verificarConta interface {
    Sacar(valor float64) string
}

func PagarBoleto(conta verificarConta, valorDoBoleto float64) {
    conta.Sacar(valorDoBoleto)
}

Poderiam me indicar o que eu posso ter feito de errado?

2 respostas
solução!

Olá Dionathan! Tudo bem?

A diferença que você está observando entre ContaCorrente e ContaPoupanca em relação ao uso do operador & está relacionada à forma como você está instanciando as variáveis e ao tipo de receptor dos métodos dessas estruturas.

Vamos analisar seu código:

  1. Conta Corrente:

    var contadoDionathan *cc.ContaCorrente
    contadoDionathan = new(cc.ContaCorrente)
    

    Aqui, você está criando um ponteiro para ContaCorrente. Portanto, contadoDionathan é um ponteiro e, quando você passa contadoDionathan para a função PagarBoleto, você já está passando um ponteiro.

  2. Conta Poupança:

    contadaMae := cc.ContaPoupanca{}
    

    Aqui, você está criando uma instância de ContaPoupanca diretamente, e não um ponteiro. Portanto, para passar um ponteiro para a função PagarBoleto, você precisa usar o operador & para obter o endereço da variável contadaMae.

Para resolver isso, você pode garantir que ambas as contas sejam passadas como ponteiros. Veja como você pode ajustar o código para manter a consistência:

package main

import (
    "fmt"
    "learn-go-banco/clientes"
    cc "learn-go-banco/contas"
)

func main() {
    clienteDionathan := clientes.Titular{Nome: "Dionathan", CPF: "123.123.123.00", Profissao: "DevOps"}
    contadoDionathan := new(cc.ContaCorrente)
    contadoDionathan.Titular = clienteDionathan
    contadoDionathan.NumAgencia = 123
    contadoDionathan.NumConta = 123123
    contadoDionathan.Depositar(8000)

    //poupanca
    contadaMae := &cc.ContaPoupanca{}
    contadaMae.Depositar(2000)
    fmt.Println(contadaMae.VerSaldo())

    //interface
    PagarBoleto(contadaMae, 100)
    fmt.Println(contadaMae.VerSaldo())

    PagarBoleto(contadoDionathan, 1000)
    fmt.Println(contadoDionathan.VerSaldo())
}

// Faz um contrato com os metodos iguais
type verificarConta interface {
    Sacar(valor float64) string
}

func PagarBoleto(conta verificarConta, valorDoBoleto float64) {
    conta.Sacar(valorDoBoleto)
}

Dessa forma, contadaMae também é um ponteiro, e você não precisa usar o operador & na chamada da função PagarBoleto.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Ah sim fez todo sentido Armano, muito obrigado!