方法和工厂模式
方法介绍
在创建了一个结构体之后,结构体可能还具有一些行为,比如Person结构体还有说话、跑步、学习等,此时通过方法才能完成。
Golang
中的方法是作用在指定数据类型上的,是自定义类型。
1 | type A struct{ |
1 | package main |
- 方法
test
和结构体Person
进行绑定;只能通过Person类型的变量来进行调用 - p这个名字是任意指定的,一般是结构体名字的小写
方法声明
1 | func (receiver type) methodName (参数列表)(返回值列表){ |
- 参数列表:表示方法输入
receiver type:type
是结构体,该方法和type结构体进行绑定receiver
:是type
类型的一个变量实例return
语句不是必须的- 返回值列表可以有多个
方法案例
- 方法中不接收参数
- 方法中接收一个参数
- 方法中接收多个参数并有返回值
1 | package main |
方法的调用和传参机制
1 | package main |
- 通过一个变量调用方法时,调用机制和函数类似
- 不同之处:调用方法时,变量本身也会作为一个参数传递到方法中
- 如果变量是值类型,进行值拷贝;如果变量是引用类型,进行地址拷贝
1 | package main |
- Golang中的方法作用在指定的数据类型上,因此是自定义数据类型,都可以有方法,不仅仅是结构体,比如
int 、float32
等 - 如果一个类型实现了
String()
方法,fmt.Println()
默认会调用这个变量的String()
进行输出。
1 | package main |
课堂练习题
1 | package main |
1 | package main |
方法和函数的区别
- 调用方式不同
- 函数:函数名+实参列表
- 方法:变量.方法名(实参列表)
- 对于普通函数,接收者是值类型,不能将指针类型的数据直接传递
- 对于方法,接收者是值类型时,可以直接使用指针类型的变量调用方法,反之亦然
1 | package main |
总结:到底是哪种拷贝方式,主要是看方法中传递是值类型还是指针类型。注意观察和方法绑定的是什么类型。
OOP实例
1 | package main |
结构体创建方式
1 | package main |
工厂模式
当创建的结构体首字母是大写的,外部可以直接调用
但是一般是小写的,那么如何使用呢?此时使用到的是工厂模式。
-
stu实际上返回结构体的指针
-
如果字段是小写的,该如何进行访问?
-
package model // 定义一个结构体Student type student struct { Name string age int // 结构体中的字段改成小写,如何在外部访问? } func NewStudent(n string, a int) *student{ return &student{ Name: n, age: a, } } // 通过另外写一个方法进行访问,且方法名字必须是大写的,才能进行外部访问 func (s *student) GetAge() int{ // GetAge() 要大写,保证对外公开 return s.age }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
```go
package main
import (
"code/char26-factory/model" // 导入外部包
"fmt"
)
func main(){
var stu = model.NewStudent("tom", 40)
fmt.Println(*stu)
fmt.Println(stu.Name, stu.GetAge()) // GetaAge()是大写的
}