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

方法与指针重定向(续)

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

方法与指针重定向(续)

同样的事情也发生在相反的方向。

接受一个值作为参数的 函数必须接受一个指定类型的值 : 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