接着第九部分总结
类型判断:type-switch
处理来自外部的,类型未知的数据时,比如解析XML或者JSON编码的数据,类型测试和转换很有用。
测试一个值是否实现了某个接口
1)在Go语言中 接口将类型能做什么和如何做分离开来,这就是多态的本质
2)注意 这里的说法,测试 (一个值)是否实现了某个接口,并不是某个对象
使用方法集与接口
作用于变量上的方法实际上是不区分变量到底是指针还是值
1)指针方法可以通过指针调用
2)值方法可以通过值调用
3)接收者是值的方法可以通过指针调用,因为指针会首先被解引用
4)接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址
第一个例子:使用Sorter接口排序
这个就显示出了多态,冒泡排序针对不同的数据类型,但是数据类型要实现三个通用的方法,就可以抽出一个接口,然后具体类型具体分析。
第二个例子:读和写
使用接口,让程序更加通用
空接口
1) 概念:
就相当于Java中的基类 Object
2)构建通用类型或包含不同类型变量的数组:
就是使用空接口,这样使得程序更加普遍化。
3)复制数据切片至空接口切片:
内存中国的布局是不一样的,所以只能够一个个赋值
4)通用类型的节点数据结构:
5)接口到接口:
只要底层实现了必要的方法。
总结:
这个空指针给我的感觉就像是Java中的泛式。
反射包
1)犯法和类型的反射:
反射是通过检查一个接口的值,变量首先被转换成空接口。
2)通过反射修改值
注意:
并不是所有的值都是可以设置的,需要首先确认是否可设置(CanSet方法)
当然是要引用传递才能修改到本体的值,在Go中动态修改值即很复杂又很危险
Printf和反射
Printf就是利用反射来分析它的…的参数
其实感觉原理挺简单的
接口与动态类型:
- Go中数据和方法是一种松耦合的正交关系
- Go里面含有静态类型检查和运行时动态转换,并且不需要显式声明(这样允许我们在不改变已有代码的情况下定义和使用新接口)
- 第二点的衍生:不用提前设计出所有的接口,整个设计可以持续演进,而不用飞起之前的决定
- 也存在显式声明继承,接口中增加一个具有描述性名字的方法 hhh
- …空接口,这样的话 就实现了重载的含义
- 接口也有继承,本质上是一个多重继承
Go中的面向对象
封装: 简化成了2层(大概是由于包是基本结构的原因)
继承: 内嵌 多重继承
多态:用接口实现:某个类型的实例可以赋给它所实现的任意接口类型的变量。类型和接口是松耦合的,并且多重继承可以通过实现多个接口实现。Go 接口不是 Java 和 C# 接口的变体,而且接口间是不相关的,并且是大规模编程和可适应的演进型设计的关键。
结构体,集合和高阶函数
定义:高阶函数就是在函数的形参或者返回值中存在一个函数类型,这个就是高阶函数。
作用:部分逻辑动态生成,不用写死。
用处:往往和闭包一块使用。
这个蛮有意思的。