# 맨 아래 코드 먼저 보시고 설명 읽으시길 추천!!!

 

메서드 집합(method sets)

값의 관점에서 본 메서드 집합
메서드 수신자
T (t T)
*T (t *T)

- 설명

T        (t T) : 값 u는 T이고,  notify메서드에서의 수신자 (u user)는 (t T)를 뜻한다.

*T      (t T) 그리고 (t *T) : &u는 *T이고, notify메서드의 수신자 (u *user) 또는 (u user)는 (t T) 와 (t *T)를 뜻한다.

 

수신자의 관점에서 본 메서드 집합
메서드 수신자
(t T) T와 *T
(t *T) *T

-설명

(t T)        T와 *T  : notify메서드에서의 수신자 (u user)는 (t T)이고, u와 &u는 T와 *T를 뜻한다.

(t *T)      *T  : notify메서드의 수신자 (u *user)는 (t *T)이고, &u는 *T를 뜻한다.

 

 

package main

import "fmt"

 

type notifier interface {

    notify()

}

 

type user struct {

    name  string

    email string

}

 

func (u *user) notify() { // (u *user) 수신자

    fmt.Printf("사용자에게 메일을 전송합니다: %s<%s>\n", u.name, u.email)

}

 

func sendNotification(n notifier) {

    n.notify()

}

func main() {

    u := user{"Bill", "bill@email.com"} // u값

    sendNotification(u) //&u로 전달해야 컴파일 가능

}

 

현재 이코드는 작동하지 않는데 이유는 notifier interface가 nofity() 메서드를 가지고 있는데 

notify메서드의 수신자는 u *user(포인터 수신자)이다. 하지만 main에서 sendNotification 인수로 &u가 아닌 u를 전달하고 있다.

위의 메서드 집합에 따르면 메서드 수신자 (u *user) 포인터 이므로 &u 같이 주소만를 전달할 있다. 

 

출처 : 책. Go 인 액션 132쪽 메서드 집합

+ Recent posts