- 对于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 }
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())
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