[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") )