쉽고 빠른 Go 시작하기(3)

이지수·2022년 10월 19일
0

Backend Loadmap

목록 보기
9/22
post-thumbnail

BankAccount

constructor

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}

method

receiver

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

go에서 method를 만들기 위해서 함수에 receiver라는 것을 추가해주면 됩니다.
위 코드에서 (a *Account) 이 부분이 receiver입니다.

error handling

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
}

nilnull이나 none과 같습니다.

Dictionary

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
}

Add

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
}

Update

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
}

Delete

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

참고
쉽고 빠른 Go 시작하기

0개의 댓글