개요
- 함수의 일반 리시버와 포인터 리시버의 차이에 대해
- 여거에 인터페이스까지 사용하면 어떨지 확인
코드
package study
import "fmt"
type Weapon interface {
Attack()
Upgrade()
UpgradeRef()
}
type Sword struct {
damage int
}
func (s Sword) Attack() {
fmt.Println("Sword Attack", s.damage)
}
func (s Sword) Upgrade() {
s.damage++
fmt.Println("Sword New Damage1", s.damage)
}
func (s *Sword) UpgradeRef() {
s.damage++
fmt.Println("Sword New Damage2", s.damage)
}
func GetSword() Sword {
return Sword{damage: 10}
}
func GetSwordRef() *Sword {
return &Sword{damage: 10}
}
func GetWeapon() Weapon {
return Sword{damage: 10}
}
func GetWeaponRef() Weapon {
return &Sword{damage: 10}
}
결론
- 구조체 함수가 일반 리시버의 경우 call by value, 포인터 리시버의 경우 call by reference로 동작
- 구조체 선언을 일반이든, 포인터든 구조체 함수 동작에는 차이가 없음
- 인터페이스의 경우 구조체가 일반인지 포인터인지 구분함
- 일반 구조체의 경우 포인터 리시버로 구현된 함수는 취급하지 않음
- 포인터 구조체의 경우 일반 리시버로 구현된 함수는 허용