참조 타입(슬라이스, 맵)과 메서드
슬라이스와 맵은 참조 타입이므로 슬라이스와 맵을 기반으로 만든 사용자 정의 타입 메서드는 리시버를 포인터로 지정하지 않아도 리시버 값을 수정할 수 있다.
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 타입은 맵을 기반으로 한 참조 타입이므로 메서드 내부에서 리시버의 값을 수정할 수 있다.