GO

[Go]Dictionary 프로젝트 따라하기

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

 

최신글