[Go]Dictionary 프로젝트 따라하기
사전 검색 기능
1. method 생성
Go에서는 struct가 아니더라도 type으로 method를 생성할 수 있다. Dictionary 타입의 map을 생성하여 key값으로 value를 검색할 수 있는 데이터를 만들자.
package mydict import "errors" // struct가 아닌 type으로 map 생성 // Dictionary : map의 alias(별칭) // Dictionary type type Dictionary map[string]string
2. func 생성
단어(key)를 입력받으면 단어의 의미(value)를 반환해내는 function(Search())을 만들자. 에러 메시지를 변수를 빼서 값을 찾을 수 없을 때를 대비한 예외처리도 해주자.
var errNotFound = errors.New("Not Found")
// Search for a word
func (d Dictionary) Search(word string) (string, error) {
value, exist := d[word]
if exist {
return value, nil
}
return "", errNotFound
}
3. 사전 검색
사전 검색 function에 값을 넣어 출력해보자. 반환되는 값이 에러일 경우를 위한 예외처리도 해주자.
package main
import (
"fmt"
"github.com/saichoi/learngo/mydict"
)
func main() {
// dictionary에 단어 넣기
dictionary := mydict.Dictionary{"first": "First word"}
// 사전에서 second라는 단어 검색
definition, err := dictionary.Search("second")
// 값이 없다면 에러 메시지를 출력
if err != nil {
fmt.Println(err)
} else {
// 값이 존재하면 단어의 의미를 출력
fmt.Println(definition)
}
}
사전 추가 기능
1. func 생성
사전에 해당 단어가 없을 경우 단어를 추가하는 기능을 만들자. 이미 만들어둔 Search() 함수를 이용하여 검색 결과가 없을 경우 단어를 추가할 수 있게 하자.
// Add a word to the dictionary
func (d Dictionary) Add(word, def string) error {
// 이미 사전에 등록되어 있는 단어라면... Search()에서 error를 받는 경우이다.
_, err := d.Search(word) // 단어의 뜻이 필요한 것이 아니기 때문에 _를 사용하여 값을 무시한다.
// if 문 / switch문 중 택 1
// if 문의 경우
// 에러가 있으면... 즉 사전에 등록된 단어가 아니라면 단어를 추가하고
if err == errNotFound {
d[word] = def
// 에러가 없으면... 즉 사전에 이미 등록된 단어라면 에러 메시지를 반환한다.
} else if err == nil {
return errWordExists
}
return nil
// switch 문의 경우
switch err {
case errNotFound:
d[word] = def
case nil:
return errWordExists
}
return nil
}
2. 사전 추가
package main
import (
"fmt"
"github.com/saichoi/learngo/mydict"
)
func main() {
dictionary := mydict.Dictionary{"first": "First word"}
// 추가할 단어와 뜻
word := "hello"
definition := "Greeting"
// 단어추가 및 에러 체크
err := dictionary.Add(word, definition)
if err != nil {
fmt.Println(err)
}
// 추가된 단어 확인
hello, err := dictionary.Search(word)
fmt.Println(hello)
// 이미 존재하는 단어 추가 -> 에러 반환
fmt.Println("found:", word, ", definition", definition)
err2 := dictionary.Add(word, definition)
if err2 != nil {
fmt.Println(err2)
}
}
사전 수정 기능
1. func 생성
// Update a 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
}
2. 사전 수정
package main
import (
"fmt"
"github.com/saichoi/learngo/mydict"
)
func main() {
dictionary := mydict.Dictionary{}
// "hello"를 "First"로 정의
baseWord := "hello"
dictionary.Add(baseWord, "First")
// "hello"를 "Second"로 수정
err := dictionary.Update(baseWord, "Second")
if err != nil {
// 단어가 존재하지 않는다면 에러를 반환
fmt.Println(err)
}
// 수정한 단어를 찾아서 제대로 수정되었는지 확인
word, _ := dictionary.Search(baseWord)
fmt.Println(word)
}
사전 삭제 기능
1, func 생성
// Delete a word
func (d Dictionary) Delete(word string) {
delete(d, word)
}
2. 사전 삭제
package main
import (
"fmt"
"github.com/saichoi/learngo/mydict"
)
func main() {
dictionary := mydict.Dictionary{}
// "hello"를 "First"로 정의
baseWord := "hello"
dictionary.Add(baseWord, "First")
// Search()로 단어를 검색
dictionary.Search(baseWord)
// Delete()로 단어를 삭제
dictionary.Delete(baseWord)
// 삭제된 단어를 다시 검색
word, err := dictionary.Search(baseWord)
if err != nil {
fmt.Print(err)
} else {
fmt.Println(word)
}
}
에러 메시지를 변수로 따로 뺄 때 Go 에서는 다음과 같이 코드를 줄여줄 수 있다.
var (
errNotFound = errors.New("Not Found")
errCantUpdate = errors.New("Can't update non-exsiting word")
errWordExists = errors.New("That word already exists")
)