Server/Go

Go) Struct 이해하기

Juzdalua 2022. 11. 22. 15:24

파스칼 케이스로 export를 연습했다.

receiver, pointer, error handling을 연습했다.

// learngo/accounts/accounts.go

package accounts

import (
	"errors"
	"fmt"
)

type PublicAccount struct {
	Owner   string
	Balance int
}

type privateAccount struct {
	owner   string
	balance int
}

var errNoMoney = errors.New("can't withdraw")

// contstuctor
func NewAccount(owner string) *privateAccount {
	account := privateAccount{owner: owner, balance: 0}
	return &account
}

// method - use receiver
// receiver name must struct's first alpahbet lowercase
// receiver always make copy. we must use real receiver data with *
func (p *privateAccount) Deposit(amount int) {
	p.balance += amount
}

// if we not change value, we can use copy receiver
func (p privateAccount) Balance() int {
	return p.balance
}

func (p *privateAccount) Withdraw(amount int) error {
	// error handling
	if p.balance < amount {
		return errNoMoney
	}
	p.balance -= amount
	return nil // like null
}

func (p privateAccount) Owner() string {
	return p.owner
}

func (p privateAccount) String() string {
	return fmt.Sprintln(p.Owner(), "'s account.\nHas: ", p.Balance())
}

 

//learngo/main.go

package main

import (
	"fmt"
    "log"

	"github.com/juzdalua/learngo/accounts"
)

func main(){
	publicAccount := accounts.PublicAccount{Owner: "jun", Balance: 1000}
	fmt.Println(publicAccount)

	privateAccount := accounts.NewAccount("JUN")
	fmt.Println(privateAccount)
	privateAccount.Deposit(1000)
	fmt.Println(privateAccount.Balance())
	privateAccount.Withdraw(500)
	fmt.Println(privateAccount.Balance())
	fmt.Println(privateAccount.String())

	// Go can't use try-catch. we check error
	if err := privateAccount.Withdraw(600); err != nil {
		log.Fatalln(err)
	}
}