Go 에는 class 가 존재하지 않는다 대신에 Methods 를 정의해서 사용 할 수 있다.
methods 는 함수에 receiver 라는 특별한 arguments와 함께 사용하면 된다.
receiver 는 func 키워드와 methods 이름 사이에 위치 하게 된다
package main
import "fmt"
type person struct {
name string
age int
}
// person struct의 methods
func (p person) introduction(){
fmt.Printf("Hi, my name is %s i'm %d years old\n", p.name, p.age)
}
func main(){
me := person{"obm", 19}
me.introduction()
}
위 예제를 보면 func 키워드와 methods 사이에 (p person) 이 있는 것을 확인 할 수 있다.
receiver 의 이름은 임의로 정할 수 있지만 일반적으로 타입의 맨 앞글자를 가져와서 사용한다.
receiver 는 pointer 와 함께 사용 할 수 있습니다.
type person struct {
name string
age int
}
func (p person) modifyName(name string) {
p.name = name
fmt.Println(p.name)
}
func main(){
me := person{"obm", 19}
me.modifyName("newName")
fmt.Println(me.name)
}
출력 : newName
obm
위 예제를 보면 포인터를 사용 안했기 때문에 me가 copy 된 value 가 methods 에서 사용 됐기 때문에 원래 me 는 값이 변하지 않았습니다.
이는 pointer 를 사용해서 me 의 주소값을 가져와서 해결 할 수 있습니다.
func (p *person) modifyName(name string) {
p.name = name
fmt.Println(p.name)
}
func main(){
me := person{"obm", 19}
me.modifyName("newName")
fmt.Println(me.name)
}
출력 : newName
newName
Go 공식 홈페이지 를 보면 receiver pointer 를 사용하는 2가지 이유가 있다고 적혀있다.
첫번째, receiver 가 가르키는 값을 methods 로 값을 수정 할 수 있다.
두번째, methods 가 호출 될 때 마다 값이 복사되는 것을 피하기 위해서다. 이는 type 의 struct 가 커질수록 효율적이다.
일반적으로 타입이 주어진 methods 들은 value 나 pointer reveivers 를 가지게 된다
하지만 둘을 섞어서 쓰지는 않는다.
즉, 값을 복사 할 것인가 pointer를 쓸 것인가 선택할 수 있지만 둘을 혼합해서 코딩하는 일은 피하도록 하자.