什么是CSP并发模型:

严格的说CSP 应该是一门形式语言: 用于描述并发系统的互动模式。

CSP 中文名称叫 通信顺序进程, 是一个 很强大的并发编程模型,是Go语言成功的中重要因素 : go语言并未完全使用CSP模型, 而仅仅使用了 process 和 channel两个概念

process : 在go语言中 即 goroutine

go语言使程序员开发时 更轻松, 而不用考虑 线程数 ,线程 开销,线程调度 等底层问题,goroutine天生就为我们实现好了。

goroutine 和channel是 go语言 并发编程的两大基石: goroutine 负责执行并发业务, 而channel 用于goroutine之间的同步通信。 goroutine 是 线程安全的

go的并发哲学

不要使用共享内存 来通信, 而要通过通信来实现共享内存。
意味着我们不要 借助 sync包实现并发编程,而强烈建议通过channel实现并发编程。

四 Goroutine:

Goroutine是实际并发执行的实体:底层通过 coroutine(协程)来实现并发, 协程是一种运行在用户态的线程, go底层使用协程的出发点是因为:协程具有以下特点:
1 使用的是用户空间,避免了 用户态和内核态切换的开销
2 可以由语言或框架进行调度
3 协程具有更小栈空间, 那么允许创建大量的协程实例

反射初识

反射就是在程序运行是时,能够观察自己, 并修改自己的行为的一种机制。

反射是和接口类型相关的 , 只有interface 类型才有反射这一说

要理解反射 ,就得理解 接口的pair 属性 。

pair(实体值, 类型)

反射 实质: 在运行时,能够动态的获取 接口的 值 和类型, 进而进行一些其他的操作。

reflect包 :下 TypeOf() 和 ValueOf ()

1 现有 接口类型变量
2 转化为 reflect 类型
3 通过接口来获取

需要反射的两个场景:

1 有时候编写的函数, 不知道需要接受什么类型,
2 有时候需要根据某些条件来决定调用哪个函数,比如由用户的输入来确定, 这时候就需要对函数和函数的参数进行反射,在运行期间动态的执行函数。

在这里插入图片描述

注意下边代码只是用来检验 反射 ,并不是说这样写更科学

在这里插入图片描述

反射对象.Kind() 是说种类 :eg: slice 、 map、 pointer、 struct、interface、 array\ Function 、int等等

Type()是说类型: 比如 : Person 类 等

比如
type Person struct {

}

那么 Kind 就是 struct 而 Type 是 Person

如何通过反射对象 设置 实际变量的值?

** 注意的是: 需要修改 必须拿到指针。才可以修改**

在这里插入图片描述

设置实际变量的值 : 指针方式

注意:

1 要通过 反射来调用对应的方法,必须先通过reflect.ValueOf()获取到 “反射类型的对象“后才能做下一步处理,

2 反射类型对象.MethodByName() 这个 MethodByName,需要指定准确的真实的方法名字, 错了就会直接panic, MethodByName 返回一个函数值对应的reflect.Value(反射类型对象)方法的名字
3 【】reflect.Value, 是最重要调用的方法的参数, 我们用切片进行存储, 空的时候也可以传nil

4 反射类型对象的Call 方法,这个方法最终调用真实的方法,参数必须保持一致, 如果反射类型对象.Kind不是一个方法, 那么直接panic

5 ( 本来可以用对象直接调用方法的) 我们采用反射,首先得将方法注册,也就是MethodByName, 然后通过反射调用methodValue.Call