더북(TheBook)

참조 타입(슬라이스, 맵)과 메서드

슬라이스와 맵은 참조 타입이므로 슬라이스와 맵을 기반으로 만든 사용자 정의 타입 메서드는 리시버를 포인터로 지정하지 않아도 리시버 값을 수정할 수 있다.

type numberMap map[string]int
 
func (m numberMap) add(key string, value int) {
    m[key] = value
}
 
func (m numberMap) remove(key string) {
    delete(m, key)
}
 
func main() {
    m := make(numberMap)
    m["one"] = 1
    m["two"] = 2
    m.add("three", 3)
    fmt.Println(m) // map[one:1 two:2 three:3]
    m.remove("two")
    fmt.Println(m) // map[three:3 one:1]
}

map[string]int를 보면 알 수 있듯이 맵을 기반으로 numberMap 타입을 정의했고, numberMap 타입에 add()remove() 메서드를 정의했다. add()remove() 메서드의 리시버인 m numberMap은 포인터로 지정하지 않았지만, numberMap 타입은 맵을 기반으로 한 참조 타입이므로 메서드 내부에서 리시버의 값을 수정할 수 있다.

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