### 概述
在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种
带有接收者的函数,我们称为方法(method) .本质上,一个方法是一个和特殊类型关联的函数. 一个面向对
象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是
借助方法来做这些事情 .
在go语言中,可以给任意类型(包括内置类型,但不包括**指针类型**)添加相应的方法 .方法总是绑定对象实例,
并隐式将实例作为第一实参(receiver).方法语法如下 :
func (receiver ReceiverType) funcName(parameters)(results)
* 参数receiver可任意命名.放方法中未曾使用,可省略参数名
* 参数receiver类型可以是T或*T. 基类型T不能是接口或指针
* 不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法.
### 类型的本质
~~~
在声明一个新类型之后,声明一个该类型的方法之前,需要先回答一个问题:这个类型的本质
是什么。如果给这个类型增加或者删除某个值,是要创建一个新值,还是要更改当前的值?如
果是要创建一个新值,该类型的方法就使用值接收者。如果是要修改当前值,就使用指针接者。
这个答案也会影响程序内部传递这个类型的值的方式:是按值做传递,还是按指针做递。保持
传递的一致性很重要。这个背后的原则是,不要只关注某个方法是如何处理这个值,而要关注
这个值的本质是什么。
~~~
**简单的说当对结构体的数据进行增加或删除时,使用值拷贝.进行修改时,使用引用地址**
### 实例
~~~
type long int
//给某个类型绑定一个函数
func (temp long) Add(other long) long { //temp叫接收者,接收者就是传递的一个参数
return temp + other
}
func main() {
var a long = 2 //定义一个变量并赋值
fmt.Println(a.Add(4)) //得到结果是6
~~~
### 为结构体添加方法
~~~
type Person struct {
name string
age int
gender byte
}
//带有接收者的函数叫方法
func (tmp Person) PrintInfo() {
fmt.Println(tmp)
}
//通过一个函数,给成员赋值
func (p *Person) setInfo(name string, age int, gender byte) {
p.name = name
p.age = age
p.gender = gender
}
func main() {
p := Person{"jack", 20, 1}
p.PrintInfo()
//定义一个结构体变量
var p2 Person
p2.setInfo("milan", 18, 0)
p2.PrintInfo()
}
~~~
~~~
{jack 20 1}
{milan 18 0}
~~~
### 不能为指针类型
~~~
type pointer *int
type long int
func (p pointer)test(){ //报错,因为pointer不能为指针类型
}
func (p *long)test(){ //这里可以通过
}
~~~
### 接收者类型不同函数名可以同名
以下不会报错,因为函数的接收者类型不同.
~~~
type char byte
type long int
func (tmp char) test() {
}
func (tmp long) test() {
}
~~~
- 基本语法
- 申明变量
- 常量
- 数据类型
- 强制类型转换
- 获取命令行参数
- 指针
- 概述
- new函数
- 函数
- 概述
- 不定参数类型
- 有返回值
- 函数类型
- 回调函数
- 匿名函数和闭包
- 延迟调用defer
- 工程管理
- 工作区
- src,pkg和bin目录
- 复合类型
- 概述
- 数组
- 概述
- 声明并初始化
- 拷贝传值
- slice
- 概述
- 创建切片
- 切片截取
- 切片和底层数组的关系
- slice常用方法
- 切片做函数参数
- map
- 概述
- map操作
- 结构体
- 概述
- 结构体初始化
- 结构体比较
- 结构体作为函数参数
- 结构体前加&
- 面向对象
- 概述
- 匿名组合
- 方法
- 值语义和引用语义
- 方法集
- 方法的继承
- 方法重写
- 方法值
- 接口
- 接口定义和实现
- 多态的表现
- 接口继承
- 接口转换
- 空接口
- 类型断言
- 异常处理
- error接口
- panic
- recover
- 文本文件处理
- 字符串操作
- 正则表达式
- json处理
- 文件操作
- 标准设备文件操作
- 并发编程
- 概述
- 并发和并行
- go语言并发优势
- goroutine
- goroutine概述
- 创建goroutine
- 主协程先退出
- runtime包
- Gosched
- Goexit
- GOMAXPROCE
- channel
- 多资源竞争
- channel类型
- 无缓冲channel
- 有缓冲channel
- 关闭channel
- 单向channel
- 单向channel特性
- 定时器
- Timer
- Ticker
- select
- select作用
- 超时
- sync
- 竞争状态
- 网络编程
- 网络概述
- 网络协议
- 分层模型
- 网络分层架构
- 层与协议
- 每层协议的功能
- 链路层
- 网络层
- 传输层
- 应用层
- socket编程
- 组合和继承
- 注意事项
- 细节
- go语言实现队列
- google工程师golang
- 基础语法
- 内建容器
- 面向"对象"
- 依赖管理
- 面向接口
- 函数式编程
- 错误处理和资源管理
- 测试与性能调优
- goroutine
- channel
- golang问题集
- 断言和类型转换
- Go语言圣经
- 入门
- 程序结构
- 命名
- 声明
- 变量
- 赋值
- 类型
- 包和文件
- 作用域
- 基础数据类型
- 整数
- 浮点数
- 复数
- 布尔型
- 字符串
- 常量
- 复合数据类型
- 数组
- slice
- map
- 结构体
- json
- 文本和HTML模板
- 函数
- 函数声明
- 错误
- 函数值
- 匿名函数
- defer
- panic
- recover
- 方法
- 方法声明
- 指针对象的方法
- 封装
- 接口
- 说明
- 接口是合约
- 实现接口的条件
- 接口值
- 类型断言
- 通过类型断言询问行为
- 类型开关
- Goroutines和Channels
- 协程
- channels
- 无缓冲channel
- 串联的channel
- 有缓冲channel
- 并发的循环
- select多路复用
- 并发的退出
- 并发问题的自我思考
- 基于共享变量的并发
- 竞争条件
- 互斥锁
- 读写锁
- 内存同步
- sync.Once
- 协程和线程
- 包和工具
- 测试
- 反射
- 什么是反射
- 为什么需要反射
- reflect.Type和reflect.Value
- 通过reflect.Value修改值
- 底层编程
