더북(TheBook)

SharedMap 액션 메서드 정의

상수로 정의한 actionset, get, remove, count에 대한 메서드(SharedMap에서 처리할 액션)는 다음과 같이 정의한다.

func (sm SharedMap) Set(k string, v interface{}) {
    sm.c <- command{action: set, key: k, value: v}
}
 
func (sm SharedMap) Get(k string) (interface{}, bool) {
    callback := make(chan interface{})
    sm.c <- command{action: get, key: k, result: callback}
    result := (<-callback).([2]interface{})
    return result[0], result[1].(bool)
}
 
func (sm SharedMap) Remove(k string) {
    sm.c <- command{action: remove, key: k}
}
 
func (sm SharedMap) Count() int {
    callback := make(chan interface{})
    sm.c <- command{action: count, result: callback}
    return (<-callback).(int)
}

기본 패턴은 command 값을 만들어 SharedMapc 채널로 전달하고(sm.c <- command{ ... }), result 필드로 지정한 채널(callback)을 통해 결과를 받아와서 반환하는 식이다.

Get()Count() 메서드에서 callback으로 결괏값을 받아와 반환하는 부분을 주의 깊게 살펴보자. Count()는 맵에 있는 아이템의 개수를 반환하는 메서드다. 그래서 callback으로 전달받은 결괏값을 int로 변환해서 반환한다.

(<-callback).(int)

Get()은 특정 키에 해당하는 값과 맵에 해당 키가 있는지, 이렇게 두 개의 값을 반환하는 메서드다. 그래서 callback으로 전달받은 값을 [2]interface{}로 변환하고, 배열의 두 번째 매개변수를 다시 bool로 변환해서 반환한다.

result := (<-callback).([2]interface{})
return result[0], result[1].(bool)

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.