Go面向对象

4/20/2021 go

# 面向对象

# 结构体

声明结构体,格式:

type 结构体名 struct {
    属性名   属性类型
    属性名   属性类型
    ...
}

// 示例 
type Person struct {
    name string
    age int
}
1
2
3
4
5
6
7
8
9
10
11

# 方法

构建一个方法,格式:

func (实例名 结构体名) 方法名 {
}

// 示例 
func (person Person) FmtPerson {
    fmt.Printf("名字:%s\n", person.name)
    fmt.Printf("年龄:%d\n", person.age)
}
1
2
3
4
5
6
7
8

完整示例

// 定义一个名为 Person 的结构体
type Person struct {
	name   string
	age    int
	gender string
}

// 定义一个与 Person 的绑定的方法
func (person Person) FmtPerson() {
	fmt.Printf("名字:%s\n", person.name)
	fmt.Printf("年龄:%d\n", person.age)
	fmt.Printf("性别:%s\n", person.gender)
}

func main() {
	// 实例化
	myself := Person{name: "小明", age: 24, gender: "male"}
	// 调用函数
	myself.FmtPerson()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 方法参数类型

方法的参数类型可以是实例,也可以是指针,两者的区别在于参数为指针时,可以修改实例对象的属性值,

// 参数是指针,去除*,修改person的属性值,打印结果为24
func (person *Person) increaseAge() {
   person.age += 1
}

fmt.Printf("当前年龄:%d\n", myself.age)

// 当前年龄:25
1
2
3
4
5
6
7
8

什么时候采用方法参数类型:

  • 需要在方法体内改变结构体内容
  • 出于性能原因,当结构体过大的时候,(未验证,参考别人说的)
  • 考虑代码一致性

# 结构体继承

go里面没有类的概念,有的叫组合,把一个结构体的内容嵌入到另外一个结构体中就叫做组合,那个结构体可以直接使用内部结构体的属性

type company struct {
    companyName string
    companyAddr string
}

type staff struct {
    name string
    age int
    gender string
    position string
    company		// 匿名字段 等同于把company的属性都加入进来了
}

func main() {
	myCompany := company{"腾讯", "深圳"}
	myStaff := staff{"张三", 18, "男", "重庆", myCompany}
	fmt.Printf("%s 在 %s 工作\n", myStaff.name, myCompany.companyName)
	fmt.Printf("%s 在 %s 工作\n", myStaff.name, myStaff.companyName)
	fmt.Printf("%s 在 %s 工作\n", myStaff.name, myStaff.company.companyName)
}

// 张三 在 腾讯 工作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

最终myCompany.companyNamemyStaff.companyNamemyStaff.company.companyName的结果都是一样的

# 内部方法和外部方法

go语言中,要区分函数首字母大小写,它决定方法的访问权限

  • 首字母大写,这个方法对所有包都是public,都能调用
  • 搜字母小写,这个方法是private,其他包无法访问

# 方法和函数的区别

方法可以理解为特殊的函数,当函数和对象/结构体绑定的时候,就可以称这个函数是个方法

  • 函数
func 函数名(形式参数列表)(返回值列表){
    函数体
}
1
2
3
  • 方法
func 方法名(实例名 结构体名)(返回值列表)(){
    方法体
}
1
2
3

# 练习源码

Object (opens new window)