Dictionary.go

package mydict

// Dictionary type
type Dictionary map[string]string

위와 같은 type으로 된 Dictionary map을 만들어준다. 

패키지는 위와 같다.

main.go

func main() {
	dictionary := mydict.Dictionary{"first":"first"}
	fmt.Println(dictionary)
}

main에서 위와같이 사용할 수 있을 것이다. 하지만, 에러 처리등 불편한 점이 존재하고있는 상태다. 이전에 배운 method를 활용해 main을 가독성 좋게 작성해보자.

 

Search

var errNotFound = errors.New("Not Found")

func(d Dictionary) Search(word string) (string, error) {
	value, exists := d[word]
	if exists {
		return value, nil
	}
	return "", errNotFound
}

mydict.go에 위 method를 추가한다.

func main() {
	dictionary := mydict.Dictionary{"first":"first"}
	value, err := dictionary.Search("second")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(value)
	}
}

main.go에서 dictionary에 있는 search method를 사용해 출려본다.

출력

정상적으로 error handling이 되는 모습이다. err가 발생했을 때, 시스템이 더이상 돌아가지 않게 하고싶다면 다른 방법으로 if문 안을 처리하면 된다. 이러한 방식이 단순히 map을 사용하여 key를 통해 value를 얻는 방식보다 개발자가 원하는 방식대로 error를 handling할 수 있기때문에 각자의 취향대로 선택하면 될 것 같다.

 

 

Add

var errExistsWord = errors.New("That word already exists")

func(d Dictionary) Add(word, def string) error {
	_, err := d.Search(word)	// 이미 key로 된 중복된 단어가 있는지 확인
	switch err {
	case errNotFound:
		d[word] = def
	case nil:
		return errExistsWord
	}
	return nil
}

mydict.go에 위와같은 method를 추가해준다.

func main() {
	dictionary := mydict.Dictionary{}
	err := dictionary.Add("first", "first")
	if err != nil {
		fmt.Println(err)
	}
	def, err := dictionary.Search("first")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(def)
	}
}

main.go에서 확인해주면 정상적으로 추가가되고, error가 handling되는 모습을 볼 수 있다.

 

 

Update Delete

var errCantUpdate = errors.New("Can`t update non-exitstiong word")

func(d Dictionary) Update(word, def string) error {
	_, err := d.Search(word)
	switch err {
	case nil:
		d[word] = def
	case errNotFound:
		return errExistsWord
	}
	return nil
}

// Delete a word
func(d Dictionary) Delete(word string) {
	delete(d, word)
	// word가 없다면 아무 작업도 하지 않음
}

mydict.go 에 위와 같은 메소드를 추가해준다.

func main() {
	dictionary := mydict.Dictionary{}
	err1 := dictionary.Add("first", "first")
	if err1 != nil {
		fmt.Println(err1)
	}
	
	err2 := dictionary.Update("first", "second")
	if err2 != nil {
		fmt.Println(err2)
	}
	word, _ := dictionary.Search("first")
	fmt.Println(word)

	dictionary.Delete("first")
	word2,err3 := dictionary.Search("first")
	if err3 != nil {
		fmt.Println(err3)
	} else {
		fmt.Println(word2)
	}
}

출력

map의 key가 "first"인 value의 값이 "second"로 변경되어 출력되었고, delete후 search를 했을 때 찾을 수 없다는 error handling이 된 것을 확인할 수 있다.

 

'Go' 카테고리의 다른 글

Job Scrapper  (0) 2024.01.29
URL Checker & Go Routine  (0) 2024.01.14
struct/public,private/String()/error handling  (0) 2024.01.07
Struct  (0) 2024.01.04
Maps  (0) 2023.12.30

+ Recent posts