accounts/accounts.go
package accounts
// Account strunct
type Account struct {
owner string
balance int
}
// NewAccount creates Account
func NewAccount(owner string) *Account {
account := Account{owner: owner, balance: 0}
return &account
}
구조체의 멤버변수를 만들때 대소문자에 유의해야 합니다. 앞글자가 대문자일 경우 public, 소문자일 경우 private 입니다.
위에서는 본인만 계좌에 접근하기 위해 private으로 만들었습니다.
NewAccount 함수는 object의 실제 메모리 주소를 return 합니다.(매번 복사할 필요 없음)
main.go
package main
import (
"fmt"
"github.com/jisoolee11/go-for-beginners/bankAccount/accounts"
)
func main() {
account := accounts.NewAccount("jisoo")
fmt.Println(account)
}
// &{jisoo 0}
// Deposit x amount on your account
func (a *Account) Deposit(amount int) {
a.balance += amount
}
go에서 method를 만들기 위해서 함수에 receiver라는 것을 추가해주면 됩니다.
위 코드에서 (a *Account) 이 부분이 receiver입니다.
go에는 exception 기능이 없어서 에러를 직접 다뤄줘야 합니다.
var errNoMoney = errors.New("Can't withdraw") // error 메세지 생성
// Withdraw x amount on your account
func (a *Account) Withdraw(amount int) error { // error 다루기
if a.balance < amount {
return errNoMoney
}
a.balance -= amount
return nil
}
nil
은 null
이나 none
과 같습니다.
Dictionary는 map[string]string
type의 가명입니다.
type Dictionary map[string]string
Dictionary 타입으로 Search 메소드를 구현합니다.
mydict/mydict.go
var errNotFound = errors.New("Not Found")
// Search for a word
func (d Dictionary) Search(word string) (string, error) {
value, exists := d[word]
if exists {
return value, nil
}
return "", errNotFound
}
Dictionary 타입으로 Add 메소드를 구현합니다.
mydict/mydict.go
var errWordExists = errors.New("That word already exists")
// Add a word to the dictionary
func (d Dictionary) Add(word, def string) error {
_, err := d.Search(word)
switch err {
case errNotFound: // dictionary에 word가 없다면
d[word] = def
case nil: // dictionary에 word가 있다면
return errWordExists
}
return nil
}
Dictionary 타입으로 Update 메소드를 구현합니다.
mydict/mydict.go
// Update a word
var errCantUpdate = errors.New("Can't update non-existing word")
func (d Dictionary) Update(word, definition string) error {
_, err := d.Search(word)
switch err {
case nil:
d[word] = definition
case errNotFound:
return errCantUpdate
}
return nil
}
Dictionary 타입으로 Delete 메소드를 구현합니다.
// Delete a word
func (d Dictionary) Delete(word string) {
delete(d, word)
}
main.go
func main() {
dictionary := mydict.Dictionary{}
baseWord := "hello"
dictionary.Add(baseWord, "First")
dictionary.Search(baseWord)
dictionary.Delete(baseWord)
word, err := dictionary.Search(baseWord)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(word)
}
}
// Not Found