Go函数篇--方法的定义

  • 对于Go语言的面向对象编程(OOP),对象就是一个简单的值或者变量,并且拥有其方法,而方法就是特定类型的函数
  • 关键的两个原则:封装、组合

一、方法的声明

方法的声明和普通函数类似,只是在函数名字的前面多了一个参数。该参数将这个方法绑定到这个参数对应的类型上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

type Circle struct {
radius float64
}


// 将方法绑定到Circle类型,Circle对象就可以使用这个方法
func (c Circle) getArea() float64 {
return 3.14 * c.radius * c.radius
}

func main() {
var c1 Circle
var c2 Circle
c1.radius = 10.00
c2.radius = 12.00

fmt.Println("c1 area is: ", c1.getArea())
fmt.Println("c2 area is: ", c2.getArea())

// func(main.Circle) float64
fmt.Printf("%T \n", Circle.getArea)
}
  • 参数c称为函数的接收者
  • nil是合法的接收者
  • 除了指针和接口类型,其他类型都可以声明方法(结构体,数值,字符串,slice,map,函数这些都是可以的,常见的是结构体)

二、指针接收者

声明方法的时候,只有两种类型可以作为接收者,一种是命名类型,另一种是指向命名类型的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14

type Circle struct {
radius float64
}


func (c Circle) getArea() float64 {
return 3.14 * c.radius * c.radius
}

func (c *Circle) getArea() float64 {
return 3.14 * c.radius * c.radius
}

不允许本身是指针的类型进行方法声明

1
2
type P *int
func (P) f(){} // 编译错误

以下几种形式都是可以的

1
2
3
4
5
6
7
8
9
c1 := &Circle{1}
c1.getArea()

c2 := Circle{2}
_c2 := &c2
_c2.getArea()

c3 := Circle{3}
(&c3).getArea()

Refs