【重学Golang 】—05 方法

137 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

在 js 语言中,会认为函数其实和方法一样,但在 Go 中,函数和方法是两个不同概念。最主要的不同是方法必须要有一个接收者。这个接收者是一个类型。即方法是和类型绑定。所以,函数所具备的功能,方法也都有,方法多了一个接收者。

我将其理解为:某类型拥有属性和方法。不能说是函数。

方法声明

type Point struct{ 
  X, Y float64 
}
​
func (p Point) DealFunc() float64 {
    return p.x+p.y
}

从上面代码可以看到和函数不同的地方:定义方法时会在关键字 func 和方法名 DealFunc 之间加一个接收者(p Point),接收者使用小括号包围。

值类型接收者和指针类型接收者

从上面例子看,接收者是一个值类型。Go语言中,指针类型能够帮助我们只需要内存地址就可以改变某指针的物理值。如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大的时候,我们可以用指针。所以方法的接收者也可以是指针类型。

func (p *Point) Modify(factor int){
   p.x = factor
   p.y = factor
}
​
// 调用
point := Point{7,8}
point.modify(10)

在调用方法时,传递的接收者是值类型式其实可以看作是一个副本,如果进行修改则原有值没有影响。但如果是指针类型,指针具有指向原有值的特性,所以修改指针指向的值也相当于是修改了原有的值。所以值接收者使用的是值的副本来调用方法,而指针接收者使用实际的值来调用。

在Go 中,使用值类型变量调指针类型接收者的方法,go语言编译器会自动取指针调用;如果是指针类型接收者,Go 语言编译器会自动帮我们解引用调用。

总之,方法的接收者可以是指针也可以是值,Go语言会自动转义,提高开发效率避免错误。使用时只需要根据具体需求进行使用。