프로그래밍/golang
ultimate in go (3)- data structure(method)
by 나도한강뷰
2023. 1. 23.
method
value and pointer receiver call
- 함수가 리시버와 함께 호출되면, 메소드로 변한다
- 이러한 리시버는 value, pointer 각각의 형태로 입력받을 수 있다.
- user 타입의 변수는 value & pointer receiver를 사용하는 모든 메서드를 호출할 수 있다.
- user의 포인터 타입 변수 역시 value & pointer receiver를 사용하는 모든 메서드를 호출할 수 있다.
type user struct {
name string
email string
}
func (u user) notify() {
fmt.Printf("Sending User Email To %s<%s>\\n", u.name, u.email)
}
func (u \*user) changeEmail(email string) {
u.email = email
fmt.Printf("Changed User Email To %s\\n", email)
}
bill := user{"Bill", "[bill@email.com](mailto:bill@email.com)"}
bill.notify()
bill.changeEmail("[bill@hotmail.com](mailto:bill@hotmail.com)")
Sending User Email To Bill[bill@email.com](mailto:bill@email.com)
Changed User Email To [bill@hotmail.com](mailto:bill@hotmail.com)
hoanh := &user{"Hoanh", "[hoanhan@email.com](mailto:hoanhan@email.com)"}
hoanh.notify()
hoanh.changeEmail("[hoanhan101@gmail.com](mailto:hoanhan101@gmail.com)")
Sending User Email To Hoanh[hoanhan@email.com](mailto:hoanhan@email.com)
Changed User Email To [hoanhan101@gmail.com](mailto:hoanhan101@gmail.com)
- 내부적으로 알아서 value는 pointer로 pointer는 value로 변환해줌
- for range구문에서 내부값을 pointer리시버를 통해서 수정을 하더라고, 그 내부값자체가 복사받은값이라는것을 명심해야된다.
value and pointer semantics
- int, string, boolean같은 경우는 값으로 호출하는 것을 선호하고,
- slice, map, channel, interface같은 경우도 값으로 호출하는 것을 선호한다.
- 리시버 타입이 호출, 참조 둘중에 더 적합한 쪽으로 설정한다.