指针接收者
指针接收者
你可以为指针接收者声明方法。
这意味着对于某类型 T ,接收者的类型可以用 *T 的文法。( 此外, T 不能是像 *int 这样的指针。 )
例如,这里为 *Vertex 定义了 Scale 方法。
指针接收者的方法可以修改接收者指向的值(就像 Sca le 在这做的)。由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。
试着移除第 16 行 Scale 函数声明中的 * ,观察此程序的行为如何变化。
若使用值接收者,那么 Scale 方法会对原始 Vertex 值的副本进行操作 , 而使用指针接收者可以对其对应的数据进行修改 (对于函数的其它参数也是如此。) Scale 方法必须用指针接受者来更改 main 函数中声明的 Vertex 的值。
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 (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) fmt.Println(v.Abs()) }
26
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 ( v
Vertex ) Scale ( f
float64 ) { 17
v . X
=
v . X
f 18
v . Y
=
v . Y
f 19 } 20 21 func
main () { 22
v :
Vertex { 3 , 4 } 23
v . Scale ( 10 ) 24
fmt . Println ( v . Abs ()) 25 } 26