## 定义
类的定义是依托结构体来的,比如
```
type Person struct {
name string
age uint
male bool
}
```
## 初始化
go不支持构造函数,析构函数,可以定义NewXXX这样的全局函数来实现类的初始化
```
func NewPerson(name string, age uint, male bool) *Person {
return &Person{name, age, male}
}
```
## 成员方法
要为 Go 类添加成员方法,需要在`func`和方法名之间添加方法所属的类型声明(有的地方将其称之为`接收者声明`)
**值方法**
```
func (p Person) GetName() string {
return p.name
}
```
Go 语言面向对象编程不像 PHP、Java 那样支持隐式的`this`指针,所有的东西都是显式声明的
若要修改类的属性,则类型声明需要设置成指针类型
**指针方法**
```
func (p *Person) SetName(name string) {
p.name = name
}
```
## 字符串格式打印类的实例
PHP、Java 支持默认调用类的`toString`方法以字符串格式打印类的实例,Go 语言也有类似的机制,只不过这个方法名是`String`
```
func (p *Person) String() string {
return fmt.Sprintf("{name: %s, age: %d, male: %t}",
p.name, p.age, p.male)
}
```
直接打印类实例,无需调用`String`方法
同一个方法集合中的方法不能出现重名,并且,如果它们所属的是一个结构体类型,那么它们的名称与该类型中任何字段的名称也不能重复。
## 基本数据类型添加成员方法
在 Go 语言中,你可以给任意类型(包括基本类型,但不包括指针类型)添加成员方法,但是如果是基本类型的话,需要借助`type`关键字对类型进行再定义
```
type Integer int
func (a Integer) Equal(b Integer) bool {
return a == b
}
```
## 继承和方法重构
通过组合来实现类的继承和方法重构
```
type Dog struct {
Animal
}
```
- php
- 安全
- php7
- 特性
- 编译安装
- 源码整体框架
- 基本变量
- thinkphp3.2.3
- thinkphp5.0
- thinkphp6.0
- laravel
- 配置
- 路由
- artisan控制台
- eloquent
- tinker
- composer
- 加密解密
- 小知识点
- 数组
- string
- 代码简洁之道
- 编译
- 语法糖
- lumen
- smarty
- 错题集
- 算法及数据结构
- 线性表结构
- 插入排序
- 冒泡排序
- 数据库
- mysql
- oracle
- PostgreSQL
- redis
- sqlserver
- 前端
- 备忘
- js
- nodejs
- vue
- css
- electron
- vue
- 语法糖
- colorui使用笔记
- 微信小程序
- 操作系统
- windows
- bat
- 快捷键
- linux
- sed
- 问题解决
- git
- docker
- docker-compose
- 正则表达式
- ps
- lua
- 协议相关
- 问题思索
- Golang
- 测试
- 读取和写入json配置文件
- 类
- 接口
- mod
- gin
- fyne
- 禅道二次开发
- 服务
- apache
- 漏洞配置
- http server优化
- nginx
- 安装
- 面试题库
- freeswitch