这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
概述
声明时,在关键字func和函数名之间增加了一个参数,这个参数被称作接收者,将函数与接收者的类型绑在一起。如果一个函数有接收者,这个函数就被称为方法。
go语言中有两种类型的接收者:值接收者,指针接收者
作用
个体用户定义的类型添加新的行为
定义和使用
定义格式:
func (var vartype) funcname(参数列表) (返回值列表) {
函数体
}
方法演示
1. 定义结构体
type miniaction struct {
name string // 接口名称
router string // 路由地址
action string // 路由对应的方法名
}
2. 为结构体增加方法
写法1:
func(mini miniaction) getMiniInfo() {
fmt.Printf(mini.name, mini.router, mini.action)
}
写法2:
func(this *miniaction)miniInfo() {
fmt.Printf(this.name, this.router, this.action)
}
3. 实例化结构体
调用:
接收者有两种,一种是值类型,一种是指针类型
接收者是值类型的时候,调用者可以是值类型,也可以是引用类型
写法1: 值类型
mini1 := miniaction {
name: "获取商品列表",
router: "productList",
action: "productList()"
}
mini1.getMiniInfo()
写法2: 指针类型
mini2 := &miniaction{
name: "获取商品列表",
router: "productList",
action: "productList()"
}
mini2.getMiniInfo()
注意:
当接收者是一个指针类型,调用者可以是值类型,也可以是指针类型
mini2.miniInfo()
(*mini2).miniInfo()
mini1.miniInfo()
注意事项
- 接收者是值类型的时候,调用者可以是值类型,也可以是引用类型
- 接收者是一个指针类型,调用者可以是值类型,也可以是指针类型
- 定义的方法只能通过指定的类型来调用,不能像函数一样去调用
- 方法的接收者对应的变量名,习惯使用this, self
比如传统编程语言当中的person类
class Person {
public name
function info() {
this.name
}
}
p = new Person()
p.info()
自定义类型也可以作为方法的接收者
- 自定义类型
type float float32
- 为自定义类型定义方法
func (radius float) getCircleAround() float {
return radius * 3.14 * 2
}
- 定义一个自定义的类型并调用方法
var radius float = 2
fmt.Println(radius.getCircleAround())
接收者类型限定
接收者不能是接口,因为接口是一类事物的抽象,而方法是某个具体事物的实现,所以不能把一个接口类型的变量作为接收者
方法和函数的区别
- 值类型,引用类型都可以作为参数使用
- 作为参数时遵循函数当中的值传递和引用传递规则
- 如果想要方法改变接收者的数据,就在接收者的指针类型上定义该方法。否则,就在普通的值类型上定义方法
- 方法调用: 调用者,方法名(参数)
- 函数调用: 函数名(参数列表)
- 首字母大小写,遵循包的规则