Den`s blog

Method & Pointer 본문

GoLang

Method & Pointer

shinYeongHyeon 2021. 1. 31. 01:48
반응형

Go 에서 Struct 를 주로 이용한다고 했는데, 여기에 메소드도 추가가 가능하다.
말로 설명하면 길어지니 코드부터 보자.

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

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

// NewAccount Creates Account
func NewAccount(owner string) *Account {
	account := Account{owner: owner, balance: 0}

	return &account
}

// Deposit x amount on your account
func (theAccount *Account) Deposit(amount int) {
	theAccount.balance += amount
}

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

// Withdraw of your account
func (theAccount *Account) Withdraw(amount int) error {
	if theAccount.balance < amount {
		return errNoMoney
	}

	theAccount.balance -= amount
	return nil
}

특징을 살펴보도록 하자.

 

1. main 이 없다.

main 이 없는 이유는 라이브러리 처럼 사용하기 때문이다.

 

2. 내가 싫어하는 주석

필자는 개인적으로 주석이 있는 코드를 안좋아하지만, Go 에서는 Type 및 Method 정의 시 정의문 위에 Method / Type 명을 시작으로 Comment 작성을 권하고, lint 도 그렇게 동작한다.
따르도록 하자.

 

3. error 에 대한 정의

go 에서는 exception 이 없다. 그렇기 때문에 모든 에러 처리를 해주어야 하는데,
var errNoMoney = errors.New("can't withdraw") 와 같이 에러를 미리 정의 해주면 깔끔해진다.
또한 에러에 대한 변수명 정의는 Go 에서 err 로 시작하는 것을 권장한다.
그래서 errNoMoney 라고 변수명을 정한다.

 

4. Constructor & Pointer

Go 에서는 pointer 가 존재한다.

 // NewAccount Creates Account
func NewAccount(owner string) *Account {
	account := Account{owner: owner, balance: 0}

	return &account
}

// Deposit x amount on your account
func (theAccount *Account) Deposit(amount int) {
	theAccount.balance += amount
}

여기에서 보면 NewAccount 함수는 *Account 를 리턴하는데, 이는 Account 의 복제본을 리턴하는 것이 아니라, 주소를 직접 보낸다.
이렇게 하는 이유는 생성자가 없기 때문이다. NewAccount 는 생성자를 대신하는 역할이라고 보면 된다.
또한 메소드는 func  메소드명 Deposit 사이에 어떤 Structure 를 받는지 명시해주면 되는데,
여기서도 theAccount *Account 로 받는 이유는 그냥 theAccount Account 로 받을 경우엔 값이 변화 되지 않기 때문이다.
이에 대해서는 어렵다면 포인터의 개념을 조금 더 이해하고 보면 쉽게 이해될 것.

728x90
반응형

'GoLang' 카테고리의 다른 글

Golang 패키지 배포기  (0) 2021.02.06
Channel  (0) 2021.01.31
Map & Structure  (0) 2021.01.31
Array / Slice  (0) 2021.01.31
For, If, Switch Statement  (0) 2021.01.31
Comments