方法与指针重定向(续)
方法与指针重定向(续)
同样的事情也发生在相反的方向。
接受一个值作为参数的 函数必须接受一个指定类型的值 : var v Vertex fmt.Println(AbsFunc(v)) // OK fmt.Println(AbsFunc(&v)) // 编译错误!
而以值为接收者的方法被调用时, 接收者既能为值又能为指针 : var v Vertex fmt.Println(v.Abs()) // OK p := &v fmt.Println(p.Abs()) // OK package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.Xv.X + v.Yv.Y) } func AbsFunc(v Vertex) float64 { return math.Sqrt(v.Xv.X + v.Yv.Y) } func main() { v := Vertex{3, 4}//默认定义的结构体为值 fmt.Println(v.Abs())//接收者可以接收值类型参数 fmt.Println(AbsFunc(v))//函数若定义为接收值类型,则只能接受值类型参数 p := &Vertex{4, 3}//指针 fmt.Println(p.Abs())//接收者虽然接受类型为值,但是依然可以接收指针 fmt.Println(AbsFunc(*p))//函数若定义为接收值类型,则只能接受值类型参数 }
x
1 package
main 2 3 import ( 4
"fmt" 5
"math" 6 ) 7 8 type
Vertex
struct { 9
X , Y
float64 10 } 11 12 func ( v
Vertex ) Abs () float64 { 13
return
math . Sqrt ( v . X * v . X
v . Y * v . Y ) 14 } 15 16 func
AbsFunc ( v
Vertex ) float64 { 17
return
math . Sqrt ( v . X * v . X
v . Y * v . Y ) 18 } 19 20 func
main () { 21
v :
Vertex { 3 , 4 } //默认定义的结构体为值 22
fmt . Println ( v . Abs ()) //接收者可以接收值类型参数 23
fmt . Println ( AbsFunc ( v )) //函数若定义为接收值类型,则只能接受值类型参数 24 25
p :
& Vertex { 4 , 3 } //指针 26
fmt . Println ( p . Abs ()) //接收者虽然接受类型为值,但是依然可以接收指针 27
fmt . Println ( AbsFunc ( * p )) //函数若定义为接收值类型,则只能接受值类型参数 28 } 29