목차
go 언어에서는
클래스가 없어
그 클래스에 갖는 메소드가 없는 대신
리시버를 통해
구조체가 갖는 메소드를 나타낼 수 있다
type Item struct {
price, discount int
}
func (i Item) DiscountPrice() int {
return i.price - i.discount
}
위와 같이 함수명 앞에
구조체 타입과 변수명을 같이 선언하면서
해당 구조체의 메소드임을 알려주고
이를 리시버라고 한다
Value 리시버
복사된 구조체의 데이터를 전달 받음
func (i Item) DiscountPrice() int {
return i.price - i.discount
}
- 메소드에서 구조체 데이터 변경이 일어나도
메소드를 호출한 호출자(구조체)의 데이터에는 변경이 없음
- 구조체의 데이터를 복사하기 때문에 메소드의 호출자가
값이든 포인터든 메소드 사용 가능
Pointer 리시버
구조체의 포인터를 전달 받음
func (i *Item) SetDiscount(newDiscount int) {
i.discount = newDiscount
}
- 메소드에서 구조체 데이터 변경이 일어나면
메소드를 호출한 호출자(구조체)의 데이터도 변경
- 메소드의 호출자가 값인 경우 사용이 불가능
- 포인터를 받기 전에 값의 복사부터 이루어져
pointer 리시버 메소드의 의도(데이터 변경)대로
동작이 이루어지지 못함
- 포인터를 받기 전에 값의 복사부터 이루어져
하지만
값에 대한 주소를 얻을 수 있는 경우에는
컴파일러가 자동으로 주소 연산자를 붙여 이를 호출함
item := Item{5000,500} // 값
item.SetDiscount(1000) // pointer 리시버 메소드 호출
// (&item).SetDiscount(1000) 컴파일러가 자동으로 변경
참고
'Go' 카테고리의 다른 글
Go run, build, install? (0) | 2021.01.20 |
---|---|
Go modules (0) | 2021.01.19 |
golang 상속? 임베딩? (0) | 2021.01.08 |
댓글