1
resposta

[Projeto] Problemas na execução do projeto

Estou com problemas na execução do projeto, está dando esse erro:

./main.go:10:35: unknown field titular in struct literal of type contas.ContaCorrente
./main.go:10:54: unknown field saldo in struct literal of type contas.ContaCorrente
./main.go:11:36: unknown field titular in struct literal of type contas.ContaCorrente
./main.go:11:56: unknown field saldo in struct literal of type contas.ContaCorrente

O codigo completo é:

main.go:

package main

import (
    "fmt"

    c "banco/contas"
)

func main() {
    contaDaSilvia := c.ContaCorrente{titular: "Silvia", saldo: 300}
    contaDoGustavo := c.ContaCorrente{titular: "Gustavo", saldo: 100}

    status := contaDoGustavo.Transferir(-200, &contaDaSilvia)

    fmt.Println(status)
    fmt.Println(contaDaSilvia)
    fmt.Println(contaDoGustavo)
}

contas/contaCorrente.go:

package contas

type ContaCorrente struct {
    titular       string
    numeroAgencia int
    numeroConta   int
    saldo         float64
}

func (c *ContaCorrente) Sacar(valorDoSaque float64) string {
    podeSacar := valorDoSaque > 0 && valorDoSaque <= c.saldo
    if podeSacar {
        c.saldo -= valorDoSaque
        return "Saque realizado com sucesso"
    } else {
        return "Saldo insuficiente"
    }
}

func (c *ContaCorrente) Depositar(valorDoDeposito float64) (string, float64) {
    if valorDoDeposito > 0 {
        c.saldo += valorDoDeposito
        return "Deposito realizado com sucesso", c.saldo
    } else {
        return "Valor do deposito menor que zero", c.saldo
    }
}

func (c *ContaCorrente) Transferir(valorDaTransferencia float64, contaDestino *ContaCorrente) bool {
    if valorDaTransferencia < c.saldo && valorDaTransferencia > 0 {
        c.saldo -= valorDaTransferencia
        contaDestino.Depositar(valorDaTransferencia)
        return true
    } else {
        return false
    }
}

quando eu digito pwd no terminal diz isso: elton@BOOK-PQ0TL9EF1O:~/dev/alura/go/banco$ pwd /home/elton/dev/alura/go/banco

1 resposta

Bom dia, Elton! Tudo bem com você?

O erro unknown field ocorre devido à visibilidade dos campos da struct ContaCorrente. Em Go, a visibilidade de campos e métodos é determinada pela primeira letra do nome:

  • Se for maiúscula, é exportada (pública)
  • Se for minúscula, não é exportada (privada)

No código que você compartilhou, os campos titular e saldo estão definidos com letra minúscula, o que os torna privados. Isso significa que eles não podem ser acessados diretamente fora do pacote onde foram definidos e por esse motivo o erro ocorre.

Para resolver, precisamos colocar os campos públicos alterando a primeira letra para maiúscula. Por exemplo:

type ContaCorrente struct {
    Titular       string
    NumeroAgencia int
    NumeroConta   int
    Saldo         float64
}

Entendeu a ideia? Legal. Agora precisamos só ajustar o arquivo main.go e contaCorrente.go para que acessem os campos com a mesma grafia, nesse caso, inicial maiúscula. Já corrigi para você e vou deixar os códigos corretos logo abaixo.

main.go

package main

import (
    "fmt"

    c "banco/contas"
)

func main() {
    contaDaSilvia := c.ContaCorrente{Titular: "Silvia", Saldo: 300}
    contaDoGustavo := c.ContaCorrente{Titular: "Gustavo", Saldo: 100}

    status := contaDoGustavo.Transferir(-200, &contaDaSilvia)

    fmt.Println(status)
    fmt.Println(contaDaSilvia)
    fmt.Println(contaDoGustavo)
}

contaCorrente.go

package contas

type ContaCorrente struct {
    Titular       string
    NumeroAgencia int
    NumeroConta   int
    Saldo         float64
}

func (c *ContaCorrente) Sacar(valorDoSaque float64) string {
    podeSacar := valorDoSaque > 0 && valorDoSaque <= c.Saldo
    if podeSacar {
        c.Saldo -= valorDoSaque
        return "Saque realizado com sucesso"
    } else {
        return "Saldo insuficiente"
    }
}

func (c *ContaCorrente) Depositar(valorDoDeposito float64) (string, float64) {
    if valorDoDeposito > 0 {
        c.Saldo += valorDoDeposito
        return "Deposito realizado com sucesso", c.Saldo
    } else {
        return "Valor do deposito menor que zero", c.Saldo
    }
}

func (c *ContaCorrente) Transferir(valorDaTransferencia float64, contaDestino *ContaCorrente) bool {
    if valorDaTransferencia < c.Saldo && valorDaTransferencia > 0 {
        c.Saldo -= valorDaTransferencia
        contaDestino.Depositar(valorDaTransferencia)
        return true
    } else {
        return false
    }
}

Dessa maneira, ao executar go run main.go, terá o resultado mostrando em aula:

false
{Silvia 0 0 300}
{Gustavo 0 0 100}

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

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