Skip to main content

面向对象

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。

自定义类型

  //将MyInt定义为int类型
type MyInt int

为什么需要自定义类型,我们可以通过自定义类型在原有类型上进行对应的特性扩充。

结构体的定义

   type 类型名 struct {
字段名 字段类型
字段名 字段类型

}

语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。

结构体的实例化

只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。

type person struct {
name string
city string
age int8
}

func main() {
var p1 person
p1.name = "pprof.cn"
p1.city = "北京"
p1.age = 18
fmt.Printf("p1=%v\n", p1) //p1={pprof.cn 北京 18}
fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18}
}

构造函数实现

func newPerson(name, city string, age int8) *person {
return &person{
name: name,
city: city,
age: age,
}
}
p9 := newPerson("pprof.cn", "测试", 90)
fmt.Printf("%#v\n", p9)

这里其实就是直接返回一个结构体的指针来实现构造函数的功能。

方法

o语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}

这里的接受者其实可以类比于其他语言的this和self。

//Person 结构体
type Person struct {
name string
age int8
}

//NewPerson 构造函数
func NewPerson(name string, age int8) *Person {
return &Person{
name: name,
age: age,
}
}

//Dream Person做梦的方法
func (p Person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}

func main() {
p1 := NewPerson("测试", 25)
p1.Dream()
}

方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。

指针类型的接收者

// SetAge 设置p的年龄
// 使用指针接收者
func (p *Person) SetAge(newAge int8) {
p.age = newAge
}

我们有时候会看到,有的方法的接受者是使用的指针有的没有。其实因为指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。所以在涉及数据的修改时,就应使用指针来当接受者。

接口

 type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2

}

接口类型变量能够存储所有实现了该接口的实例。

type Sayer interface {
say()
}
type dog struct {}
type cat struct {}

// dog实现了Sayer接口
func (d dog) say() {
fmt.Println("汪汪汪")
}
// cat实现了Sayer接口
func (c cat) say() {
fmt.Println("喵喵喵")
}

// dog实现了Sayer接口
func (d dog) say() {
fmt.Println("汪汪汪")
}

// cat实现了Sayer接口
func (c cat) say() {
fmt.Println("喵喵喵")
}

实现多个接口

// Sayer 接口
type Sayer interface {
say()
}

// Mover 接口
type Mover interface {
move()
}
type dog struct {
name string
}

// 实现Sayer接口
func (d dog) say() {
fmt.Printf("%s会叫汪汪汪\n", d.name)
}

// 实现Mover接口
func (d dog) move() {
fmt.Printf("%s会动\n", d.name)
}

func main() {
var x Sayer
var y Mover

var a = dog{name: "旺财"}
x = a
y = a
x.say()
y.move()
}

接口嵌套

// Sayer 接口
type Sayer interface {
say()
}

// Mover 接口
type Mover interface {
move()
}

// 接口嵌套
type animal interface {
Sayer
Mover
}

type cat struct {
name string
}

func (c cat) say() {
fmt.Println("喵喵喵")
}

func (c cat) move() {
fmt.Println("猫会动")
}

func main() {
var x animal
x = cat{name: "花花"}
x.move()
x.say()
}

参考链接

https://www.topgoer.com/go%E5%9F%BA%E7%A1%80/%E7%BB%93%E6%9E%84%E4%BD%93.html https://www.topgoer.com/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/%E6%8E%A5%E5%8F%A3.html