본문 바로가기
프로그래밍/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같은 경우도 값으로 호출하는 것을 선호한다.
  • 리시버 타입이 호출, 참조 둘중에 더 적합한 쪽으로 설정한다.