관리 메뉴

bright jazz music

Go - method(기본사용법, 리시버, 에러처리 등, Withdraw) 본문

Language/Go

Go - method(기본사용법, 리시버, 에러처리 등, Withdraw)

bright jazz music 2021. 2. 18. 20:49

어카운트

package accounts

import "errors"

//Account struct
type Account struct {
	owner   string
	balance int
}

var errNoMoney = errors.New("Can't witdhraw") //에러의 변수명은 err로 시작해야 함

//NewAccount creates Account
func NewAccount(owner string) *Account {
	account := Account{owner: owner, balance: 0}
	return &account //사본 말고 메모리 주소 반환
}

//Deposit x amount on your account
func (a *Account) Deposit(amount int) { //메소드임.

	//이 때 a는 Deposit 메소드의 receiver이다.
	//리시버의 이름은 struct의 첫 글자를 따서 소문자로 지어야 한다.
	//이렇게 하는 것만으로도 main에서 account.Deposit()을 사용할 수 있음
	// *을 붙이지 않으면Deposit()가 호출되어 account를 받는 순간에 복사해서 받아온다.
	//따라서 10이 들어가지 않는다.
	// 복사된 account가 아니라 호출한 원본을 사용하기 위해서는 *를 붙여야 한다.
	// 이 경우, 리시버를 포인터 리시버라고 부른다.
	// 이렇게 복사를 하는 이유는 보안 때문이다.

	a.balance += amount
}

//Balance of your account
func (a Account) Balance() int {
	return a.balance
}

//Withdraw x amount from your account
func (a *Account) Withdraw(amount int) error {
	if a.balance < amount {
		//return error.Error() 기존의 에러
		return errNoMoney //새로운 에러
		//그러나 에러가 발생해도 그게 터미널 등에 표현되지는 않는다.
		// Go에는 exception이 없기 때문이다. 따라서 err를 다룰 코드를 직접 해줘야 한다.
	}
	a.balance -= amount
	return nil //null
}

 

메인

package main

import (
	"fmt"

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

func main() {
	account := accounts.NewAccount("hojun")
	account.Deposit(10)
	fmt.Println(account.Balance())
	err := account.Withdraw(20)
	if err != nil { //에러를 받아서 처리
		fmt.Println(err)
	}
	fmt.Println(account.Balance())
}
Comments