Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 코드로배우는스프링부트웹프로젝트
- iterator
- ㅒ
- resttemplate
- 이터레이터
- 자바편
- baeldung
- 티스토리 쿠키 삭제
- 자료구조와 함께 배우는 알고리즘 입문
- /etc/network/interfaces
- Kernighan의 C언어 프로그래밍
- 처음 만나는 AI수학 with Python
- 스프링부트핵심가이드
- 데비안
- 자료구조와함께배우는알고리즘입문
- 알파회계
- 페이징
- 목록처리
- 네트워크 설정
- GIT
- d
- 코드로배우는스프링웹프로젝트
- 처음 만나는 AI 수학 with Python
- 스프링 시큐리티
- 구멍가게코딩단
- 리눅스
- 친절한SQL튜닝
- 서버설정
- network configuration
- 선형대수
Archives
- Today
- Total
bright jazz music
Go - 메소드2 (Go의 메소드 내부적 호출/ struct에 메소드 추가하기) 본문
package accounts
import (
"errors"
"fmt"
)
//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
}
// ChangeOwner of the account
func (a *Account) ChangeOwner(newOwner string) {
a.owner = newOwner
}
//Owner of the account
func (a Account) Owner() string { //owner를 반환
return a.owner
}
//Go가 내부적으로 메소드를 호출하는 경우가 있는데, string으로 struct를 반환하는 것임
// Go가 자동으로 호출해 주는 메소드.... python의 _str_처럼... 그중 하나가 String()임
func (a Account) String() string { //&{hojun 10}형식이 아래의 내용으로 바뀜
return fmt.Sprint(a.Owner(), "'s account. \nHas ", a.Balance())
}
메인
package main
import (
"fmt"
"github.com/hojuncha997/learngo/accounts"
)
func main() {
account := accounts.NewAccount("hojun")
account.Deposit(10)
// err := account.Withdraw(20)
// if err != nil { //에러를 받아서 처리
// fmt.Println(err)
// }
// fmt.Println(account.Balance(), account.Owner())
fmt.Println(account)
}
============
&{hojun 10} 에서
hojun's account.
Has 10
로 모습이 바뀜
'Language > Go' 카테고리의 다른 글
Go- map 타입에 메소드 추가하기(Add) (0) | 2021.02.19 |
---|---|
Go -map type에 메소드 추가하기(Search) (0) | 2021.02.19 |
Go - method(기본사용법, 리시버, 에러처리 등, Withdraw) (0) | 2021.02.18 |
Go - Account + NewAccount 캡술화/ func를 이용한 초기화 (0) | 2021.02.18 |
Go - struct (0) | 2021.02.18 |
Comments