메소드
golang 에서 메소드란 구조체를 함수에서 변수로 받을 수 있다.
선언을 할 때 [ func (리시버명/변수명 구조체) 함수명() 리턴타입 {} ] 형태로 선언한다.
package main import "fmt" type Rectangle struct { width, height int } func (r Rectangle) area() int { return r.width * r.height } func main() { rect := Rectangle{10, 20} fmt.Println(rect.area()) }
┌──(daleji㉿LAPTOP)-[~] └─$ go run method.go 200
[ func (변수명 구조체) 함수명() 리턴타입 {} ] 형태로 선언하면 이 함수 내부의 변수에 대한 구조체는 값이 복사가 되고 원래의 값은 변하지 않는다.
[ func (변수명 *구조체) 함수명() 리턴타입 {} ] 따라서 값도 변경하려면 func 선언할 때 구조체 앞에 [ * ] 를 추가하여 선언한다.
package main import "fmt" type Rectangle struct { width, height int } func (r Rectangle) a(a int) { r.width = r.width * a r.height = r.height * a } func (r *Rectangle) b(b int) { // 리시버 변수로 구조체 포인트를 받음 r.width = r.width * b r.height = r.height * b } func main() { rect := Rectangle{10, 20} rect.a(10) fmt.Println(rect) rect.b(10) fmt.Println(rect) }
┌──(daleji㉿LAPTOP)-[~] └─$ go run method.go {10 20} {100 200}
만약 리시버 변수를 사용하지 않는다면 _ 으로 변수를 생략할 수 있다.
package main import "fmt" type Text struct { } func (_ Text) text() { fmt.Println("Text Method") } func main() { var a Text a.text() }
┌──(daleji㉿LAPTOP)-[~] └─$ go run interface.go Text Method