구조체를 정의하고 메소드 리서버를 포인터나 값으로 정의시 차이점은 실질적은 구조체 정보를 갱신할 수 있는지 여부만 다를 뿐이다.
아래의 처리 결과는 동일한 값을 출력한다.
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
z := &Vertex{3, 4}
fmt.Println(v.Abs())
fmt.Println(z.Abs())
}
// 포인터를 메소드 리시버로 사용할 경우 처리 예시
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
//타입을 하나 정의
type entity float32
//타입을 증가하는 메소드를 정의
func (e *entity) inc() {
*e++
}
func (e entity) echo() {
fmt.Println(e)
}
func main() {
v := Vertex{3, 4}
z := &Vertex{3, 4}
fmt.Println(v.Abs())
fmt.Println(z.Abs())
//초기값을 정의
var e entity = 3
e.inc() //값을 1만큼 증가
e.echo() //결과값은 4
}
댓글
댓글 쓰기