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

方法与指针重定向

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

方法与指针重定向

比较前两个程序,你大概会注意到带指针参数的函数必须接受一个指针: var v Vertex ScaleFunc(v, 5) // 编译错误! ScaleFunc(&v, 5) // OK

而以指针为接收者的方法被调用时,接收者既能为值又能为指针: var v Vertex v.Scale(5) // OK p := &v p.Scale(10) // OK

对于语句 v.Scale(5) ,即便 v 是个值而非指针,带指针接收者的方法也能被直接调用。 也就是说,由于 Scale 方法有一个指针接收者 ,为方便起见, Go 会将语句 v.Scale(5) 解释为 (&v).Scale(5) 。

package main import "fmt" type Vertex999 struct { X, Y float64 } func (v *Vertex999) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func ScaleFunc(v *Vertex999, f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex999{3, 4} v.Scale(2) ScaleFunc(&v, 10) p := &Vertex999{4, 3} p.Scale(3) ScaleFunc(p, 8) fmt.Println(v, p) }

30

1 package

main 2 3 import

"fmt" 4 5 type

Vertex999

struct { 6

X , Y

float64 7 } 8 9 func ( v

Vertex999 ) Scale ( f

float64 ) { 10

v . X

=

v . X

f 11

v . Y

=

v . Y

f 12 } 13 14 func

ScaleFunc ( v

Vertex999 , f

float64 ) { 15

v . X

=

v . X

f 16

v . Y

=

v . Y

f 17 } 18 19 func

main () { 20

v :

Vertex999 { 3 , 4 } 21

v . Scale ( 2 ) 22

ScaleFunc ( & v , 10 ) 23 24

p :

& Vertex999 { 4 , 3 } 25

p . Scale ( 3 ) 26

ScaleFunc ( p , 8 ) 27 28

fmt . Println ( v , p ) 29 } 30