📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

指针接收者

创建时间2019-08-08最后修改2019-08-09原位置/程序员成长之旅/Go语言学习/笔记/字数369
目录:程序员成长之旅/Go语言学习/笔记

指针接收者

你可以为指针接收者声明方法。

这意味着对于某类型 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