일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- TypeScript
- PostgreSQL
- reactjs
- docker-network
- :=
- svelte
- 도커컨테이너
- IAC
- githook
- mock
- JavaScript
- cron
- 번역
- 인라인핸들러
- golang
- nestjs
- bitwiseNot
- Svelte LifeCycle
- smui
- react
- go
- onDestory
- GraphQL
- 도커
- docker
- Terraform
- ...$$restProps
- GIT
- apiTest
- testing
- Today
- Total
Den`s blog
Method & Pointer 본문
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 로 받을 경우엔 값이 변화 되지 않기 때문이다.
이에 대해서는 어렵다면 포인터의 개념을 조금 더 이해하고 보면 쉽게 이해될 것.
'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 |