005.面向对象&接口编程
1 面向函数编程
1.1 将数据作为参数传递到函数入参
1.2 对象与函数是分离的
2 面向对象编程
2.1 使用者看起来函数作为对象的属性而非参数
2.2 函数属于对象
2.3 method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样, 只是在func后面增加了一个receiver(也就是method所依从的主体)
2.4 语法
2.4.1 func (r ReceiverType) funcName(parameters) (results)
2.4.2 虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样
2.5 传递方式
2.5.1 值传递
2.5.1.1 普通类型作为Receiver仅仅是以副本作为操作对象,并不对原实例对象发生操作
2.5.2 引用传递
2.5.2.1 指针作为Receiver会对实例对象的内容发生操作
2.6 method继承
2.6.1 通过匿名字段继承 method
2.7 method重写
2.7.1 派生struct可以通过重写method覆盖
3 面向接口编程
3.1 概念
3.1.1 与Java概念一致,定义一组方法的集合
3.1.2 interface可以被任意的对象实现
3.1.3 同理,一个对象可以实现任意多个interface
3.1.4 任意的类型都实现了空interface(我们这样定义:interface{}),也就是包含0个method的interface
3.1.5 interface 变量可以接收 实现了该接口方法的任意对象
3.2 使用
3.2.1 type IntfTest interface定义接口
3.2.2 struct定义对象
3.2.3 使用method实现接口
3.2.4 使用struct继承对象属性,同时也继承了method
3.2.5 可以继续覆盖重写继承的默认method
3.2.6 使用interface变量可以访问任何实现了该接口的对象
3.3 空interface
3.3.1 不包含任何method,所以所有的类都实现了空interface
3.3.2 任何对象都可以赋值给空interface,即可以存储任意类型对象,类似于C语言的 C语言的void*
3.3.3 一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数
3.3.4 一个函数返回interface{},那么也就可以返回任意类型的值
3.4 interface作为参数
3.4.1 标准库中,fmt.Println的入参就是 ...interface{}
3.4.1.1
3.4.2 该文件中定义了 Stringer 接口,实现了该接口的对象就可以被 fmt.Println格式化输出
3.4.2.1
3.4.3 如果未实现该接口,则按照默认的格式输出,Go默认为所有对象都有该接口的实现,可以直接格式化输出
3.4.4 注意
3.4.4.1 实现了error接口的对象(即实现了Error() string的对象),使用fmt输出时,会调用Error()方法,因此不必再定义String()方法了
3.5 interface变量存储类型判断
3.5.1 使用 value, ok = element.(T) 判断
3.5.2 switch测试
3.5.2.1 switch value := element.(type)
3.5.2.2 element.(type)语法不能在switch外的任何逻辑里面使用, 如果你要在switch外面判断一个类型就必须使用第一种方法
3.6 interface组合
3.6.1 如果一个interface1作为interface2的一个嵌入字段,那么interface2隐式的包含了interface1里面的method
3.6.2 golang源码包示例
3.6.2.1
3.7 反射
3.7.1 golang的反射与Java相比功能弱很多
3.7.2 golang不支持解析string然后执行
3.7.3 golang的反射机制只能存在于已经存在的对象上面