Types and pointers
parent
27d4857f3c
commit
5d48c68b3f
@ -1,12 +1,46 @@
|
|||||||
package pointers_errors
|
package pointers_errors
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type Stringer interface {
|
||||||
|
String() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// creating a new type from an existing on
|
||||||
|
// The idea being it could be more descriptive
|
||||||
|
// but also you can declare methods on them
|
||||||
|
// which can be used to add domain specific functionality
|
||||||
|
type Bitcoin int
|
||||||
|
|
||||||
|
// this let's us use fmt strings with %s on the Bitcoin type
|
||||||
|
func (b Bitcoin) String() string {
|
||||||
|
return fmt.Sprintf("%d BTC", b)
|
||||||
|
}
|
||||||
|
|
||||||
type Wallet struct {
|
type Wallet struct {
|
||||||
balance int
|
balance Bitcoin
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w Wallet) Deposit(amount int) {
|
func (w *Wallet) Deposit(amount Bitcoin) {
|
||||||
|
// Need a pointer because the func args are copied
|
||||||
|
// so w Wallet is a copy of wallet. Not the actually refernce to the
|
||||||
|
// wallet that Deposit was called on.
|
||||||
|
|
||||||
|
// Notice we don't have to derefence the pointer like in Balance because
|
||||||
|
// in go https://go.dev/ref/spec#Method_values struct pointers are automatically
|
||||||
|
// derefenced
|
||||||
|
w.balance += amount
|
||||||
|
}
|
||||||
|
|
||||||
|
// Technically you do not need to change Balance to use a pointer receiver as taking a copy of the balance is fine. However, by convention you should keep your method receiver types the same for consistency.
|
||||||
|
|
||||||
|
func (w *Wallet) Balance() Bitcoin {
|
||||||
|
// dereferences the pointer
|
||||||
|
// which as stated above didn't need to happen because go automatically
|
||||||
|
// dereferences struct pointers.
|
||||||
|
return (*w).balance
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w Wallet) Balance() int {
|
func (w *Wallet) Withdraw(amount Bitcoin) {
|
||||||
return 0
|
w.balance -= amount
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,40 @@
|
|||||||
package pointers_errors
|
package pointers_errors
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestWallet(t *testing.T) {
|
func TestWallet(t *testing.T) {
|
||||||
|
|
||||||
|
t.Run("deposit", func(t *testing.T) {
|
||||||
wallet := Wallet{}
|
wallet := Wallet{}
|
||||||
|
|
||||||
wallet.Deposit(10)
|
wallet.Deposit(10)
|
||||||
|
|
||||||
got := wallet.Balance()
|
got := wallet.Balance()
|
||||||
want := 10
|
|
||||||
|
// %p is placeholder for address in memory
|
||||||
|
fmt.Printf("address of balance in test is %p \n", &wallet.balance)
|
||||||
|
want := Bitcoin(10)
|
||||||
|
|
||||||
if got != want {
|
if got != want {
|
||||||
t.Errorf("got %d want %d", got, want)
|
// t.Errorf("got %d want %d", got, want)
|
||||||
|
t.Errorf("got %s want %s", got, want)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("withdraw", func(t *testing.T) {
|
||||||
|
wallet := Wallet{balance: Bitcoin(20)}
|
||||||
|
|
||||||
|
wallet.Withdraw(Bitcoin(10))
|
||||||
|
|
||||||
|
got := wallet.Balance()
|
||||||
|
want := Bitcoin(10)
|
||||||
|
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("got %s want %s", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue