[Go] 인터페이스와 포인터 리시버

natae·2022년 8월 15일
0

Golang

목록 보기
4/11

개요

  • 함수의 일반 리시버와 포인터 리시버의 차이에 대해
  • 여거에 인터페이스까지 사용하면 어떨지 확인

코드

// go 1.18
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}
}

// sword := GetSword()
// sword.Upgrade() -> call by value
// sword.UpgradeRef() -> call by ref

func GetSwordRef() *Sword {
	return &Sword{damage: 10}
}

// sword := GetSwordRef()
// sword.Upgrade() -> call by value
// sword.UpgradeRef() -> call by ref

func GetWeapon() Weapon {
	return Sword{damage: 10}
}
// compile error! 'Sword' does not implement UpgradeRef()

func GetWeaponRef() Weapon {
	return &Sword{damage: 10}
}

// weapon := GetWeaponRef()
// weapon.Upgrade() -> call by value
// weapon.UpgradeRef() -> call by ref

결론

  • 구조체 함수가 일반 리시버의 경우 call by value, 포인터 리시버의 경우 call by reference로 동작
  • 구조체 선언을 일반이든, 포인터든 구조체 함수 동작에는 차이가 없음
  • 인터페이스의 경우 구조체가 일반인지 포인터인지 구분함
    • 일반 구조체의 경우 포인터 리시버로 구현된 함수는 취급하지 않음
    • 포인터 구조체의 경우 일반 리시버로 구현된 함수는 허용
profile
서버 프로그래머

0개의 댓글