六、方法
方法是与 对象实例绑定 的特殊函数,是一个面向对象的概念
方法的函数定义语法的区别:方法有前置实力接收参数
构造函数
建议返回结构体指针类型(值拷贝开销较大)
| |
调用构造函数
| |
方法 和 接受者
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。
接收者的概念就类似于其他语言中的this或者 self。
| |
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是
self、this之类的命名。- 例如,
Person类型的接收者变量应该命名为p,Connector类型的接收者变量应该命名为c等。
- 例如,
- 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
- 方法名、参数列表、返回参数:具体格式与函数定义相同。
例子:
| |
指针类型的接受者
用于修改实际的成员变量
| |
调用:
| |
值类型的接受者
当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。
在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。
| |
指针类型接受者使用场景
- 需要修改接受者的值
- 接受者是 拷贝代价比较大 的对象
- 一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。
任意类型添加方法
不仅仅是结构体,任何类型都可以拥有方法
例子,int类型添加方法
| |
注意事项: 非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法。
结构体匿名字段
定义结构体时,不写字段名只写类型:
| |
使用:
| |
注意事项:
- 一个结构体中同种类型的匿名字段只能有一个,因为要保证字段名称的唯一性
嵌套结构体
| |
“继承”
| |
结构体的字段可见性
结构体中:
- 字段大写开头表示可公开访问
- 小写表示私有(仅在定义当前结构体的包中可访问)。
结构体和JSON序列化(结构体和JSON互相转换)
| |
结构体标签
自定义序列化时的key
Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。Tag在结构体字段的后方定义,由一对反引号包裹起来结构体标签由一个或多个键值对组成
键与值使用冒号分隔,值用双引号括起来。
键值对之间使用一个空格分隔
需要严格按照格式来
结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。
例如不要在key和value之间添加空格。
| |
练习题
使用“面向对象”的思维方式编写一个学生信息管理系统。
- 学生有id、姓名、年龄、分数等信息
- 程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能
| |