GO语言的结构体反射和并发 | 青训营;

98 阅读3分钟

结构体反射

结构体反射是指使用reflect包中的函数和类型来获取和操作结构体的类型和值的过程。结构体是Go语言中一种自定义的复合数据类型,可以包含多个不同类型的字段。反射可以让你在运行时动态地获取结构体的字段名、类型、标签、值,以及修改或创建结构体的实例。

结构体相关方法

方法说明
Field(i int) StructField根据索引,返回索引对应的结构体字段的信息。
NumField() int返回结构体成员字段数量。
FieldByName(name string) (StructField, bool)根据给定字符串返回字符串对应的结构体字段的信息。
FieldByIndex(index []int) StructField多层成员访问时,根据 []int 提供的每个结构体的字段索引,返回字段的信息。
FieldByNameFunc(match func(string) bool) (StructField,bool)根据传入的匹配函数匹配需要的字段。
NumMethod() int返回该类型的方法集中方法的数目
Method(int) Method返回该类型方法集中的第i个方法
MethodByName(string)(Method, bool)根据方法名返回该类型方法集中的方法

StructField类型

StructField类型用来描述结构体中的字段的信息。

type StructField struct {
name string //字段名字
pkgPath string //字段的包路径 
type Type //字段类型 
tag StructTag //字段标签 
offset uintptr //字段在结构体中的字节偏移量
index []int //用于Type.FieldByIndex时的索引切片 
Anonymous bool //是否为匿名字段 
}

并发

基本概念

首先,我们需要先了解一下关于并发编程的几个基础概念。

  • 串行:环环相扣,一个连着一个进行。
  • 并发:同一时间段内执行多个任务(一个处理器同时处理多个任务)。
  • 并发:同一时刻执行多个任务(多个处理器或者是多核的处理器同时处理多个不同的任务。)。
  • 进程(process):程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
  • 线程(thread):操作系统基于进程开启的轻量级进程,是操作系统调度执行的最小单位。
  • 协程(coroutine):非操作系统提供而是由用户自行创建和控制的用户态 “线程” ,比线程更轻量级。

并发是指Go语言可以利用多个CPU核心或者多个线程来执行多个任务,从而提高程序的性能和效率。Go语言的并发是基于goroutine和channel的概念实现的,goroutine是一种类似于线程的轻量级执行单元,channel是一种用于在goroutine之间传递数据的通道。Go语言的并发模型是受到CSP(通信顺序进程)理论的启发,它强调通过通信来共享内存,而不是通过共享内存来通信。

goroutine

go语言中执行并发的核心就是goroutine,每个goroutine都会占用一个非常小的栈。goroutine是go程序中最基本的并发执行单元,每个go程序都至少会包含一个goroutine用于main函数中,当go程序启动时它就会自动创建并启动。

go关键字

当我们在go语言中,想要创建一个goroutine非常简单,只需要在函数或者方法的调用前加上go关键字即可。

go foo()
//创建一个goroutine运行函数foo
//匿名函数也可以通过go关键字创建goroutine来执行 
go func(){ ...
}()
func hello(){
fmt.Println("hello")
} 
func main(){ 
go hello()
fmt.Println("hi")
} //输出结果: //hi

上述代码中,我们会发现,通过goroutine的函数并未执行,这是为什么呢?因为我们的main方法执行完毕,那么其他所有goroutine不论执行到哪一步都会随之一起关闭。我们可以理解为我们在打一个Boss,这个Boss有很多分身,当我们击败Boss时,它的分身也会随之消失。