golang - 方法

242 阅读2分钟

这是我参与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()

注意事项

  1. 接收者是值类型的时候,调用者可以是值类型,也可以是引用类型
  2. 接收者是一个指针类型,调用者可以是值类型,也可以是指针类型
  3. 定义的方法只能通过指定的类型来调用,不能像函数一样去调用
  4. 方法的接收者对应的变量名,习惯使用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())

接收者类型限定

接收者不能是接口,因为接口是一类事物的抽象,而方法是某个具体事物的实现,所以不能把一个接口类型的变量作为接收者

方法和函数的区别

  1. 值类型,引用类型都可以作为参数使用
  2. 作为参数时遵循函数当中的值传递和引用传递规则
  3. 如果想要方法改变接收者的数据,就在接收者的指针类型上定义该方法。否则,就在普通的值类型上定义方法
  4. 方法调用: 调用者,方法名(参数)
  5. 函数调用: 函数名(参数列表)
  6. 首字母大小写,遵循包的规则