Carteira
que possamos depositar Bitcoin
../carteira_test.go:7:12: undefined: Carteira
Carteira
é, então vamos declará-la.carteira_test.go:15: resultado 0, esperado 10
saldo
usando a variável "receptora".carteira_test.go:15: resultado 0, esperado 10
func (c Carteira) Depositar(quantidade int)
é chamado, o c
é uma cópia do valor de qualquer lugar que o método tenha sido chamado.&meuValor
.\n
é um caractere de escape queeadiciona uma nova linha após imprimir o endereço de memória. Conseguimos acessar o ponteiro para algo com o símbolo de endereço &
.*Carteira
em vez de Carteira
que você pode ler como "um ponteiro para uma carteira".int
porque é um bom tipo para contar coisas!struct
para isso. int
é o suficiente nesse contexto, mas não é descritivo o suficiente.type MeuNome TipoOriginal
Bitcoin
, basta usar a sintaxe Bitcoin(999)
.fmt
e permite definir como seu tipo é impresso quando utilizado com o operador de string %s
em prints.String()
.carteira_test.go:18: resultado 10 BTC, esperado 20 BTC
Retirar
.Depositar()
:./carteira_test.go:26:9: carteira.Retirar undefined (type Carteira has no field or method Retirar)
carteira_test.go:33: resultado 20 BTC, esperado 10 BTC
Retirar
mais do que há de saldo na conta? Por enquanto, nossos requisitos são assumir que não há nenhum tipo de cheque-especial.Retirar
?err
para que quem a chamou possar verificá-lo e tratá-lo.Retirar
retorne um erro se tentarmos retirar mais do que temos e o saldo deverá continuar o mesmo.nil
.nil
é a mesma coisa que null
de outras linguagens de programação.nil
, porque o tipo do retorno de Retirar
vai ser error
, que é uma interface. Se você vir uma função que tem argumentos ou retornos que são interfaces, eles podem ser nulos.null
, se tentarmos acessar um valor que é nil
, isso irá disparar um pânico em tempo de execução. Isso é ruim! Devemos ter certeza que tratamos os valores nulos../carteira_test.go:31:25: carteira.Retirar(Bitcoin(100)) used as value
Retirar
e ela nunca irá retornar um valor pois o saldo será diretamente subtraído com o ponteiro e a função deve apenas retornar o erro (se houver). Para fazer compilar, precisaremos mudar a função para que retorne um tipo.Retirar
para retornar error
e por enquanto temos que retornar alguma coisa, então vamos apenas retornar nil
.errors
.errors.New
cria um novo error
com a mensagem escolhida.string
:t.Fatal
que interromperá o teste se for chamado. Isso é feito porque não queremos fazer mais asserções no erro retornado, se não houver um. Sem isso, o teste continuaria e causaria erros por causa do ponteiro nil
.carteira_test.go:61: erro resultado 'eita', erro esperado 'não é possível retirar: saldo insuficiente'
Retirar
.var
no escopo do arquivo nos permite definir valores globais para o pacote.Retirar
parece mais limpa.ErroSaldoInsuficiente
, e então agir de acordo.errcheck
, um dos muitos linters disponíveis em Go.go get -u github.com/kisielk/errcheck
errcheck .
.carteira_test.go:17:18: carteira.Retirar(Bitcoin(10))
Retirar
é bem sucedido quando um erro não é retornado.nil
.nil
ou isso vai gerar uma exceção em tempo de execução, já que o compilador não te consegue te ajudar nesses casos.