这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
基础语法:
一、reflect反射:
接口类型变量转换为反射类型变量:
reflect反射包中供了两个方法让我们可以很容易地得到一些变量内容,分别是reflect.ValueOf() 和 reflect.TypeOf()。
对于这两种方法,官方给出的解释是:
ValueOf用来获取输入参数接口中的数据的值,如果接口为空则返回0
TypeOf用来动态获取输入参数接口中的值的类型,如果接口为空则返回nil
而我们都知道,变量包括(type, value)两部分,即类型和值部分。那么显而易见的,ValueOf也就是用来获取value,TypeOf也就是用来获取type。
二、结构体:
golang里的结构体和c里面的结构体差不多。golang里是type 结构体名 struct{}
示例代码如下:
type Student struct {//定义了个Student结构体
Name string //Name属性
Age int //Age属性
}
注意,Student和Name的首字母大写表示权限的大小,相当于java中的public。如果是小写,就相当于private。
三、goroutine:
协程可以看作轻量级线程。之所以称之为轻量级,是因为即使创建了上万个也不会导致系统资源衰竭。但是要注意的是,一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,当有多个协程时,会分享该进程所获得的资源。
创建goroutine:很简单。在函数调用的语句之前加个go关键字即可,这样便创建了个并发执⾏单元。
通常,我们将主函数的goroutine称之为main goroutine。
goroutine的一些特性:
1)当main goroutine结束后,其他goroutine也会自动结束,无论执行完没有。
2)当调用runtime.Goexit()将立即终止当前goroutine执⾏,无论runtime.Goexit()下是否还有代码。
示例代码如下:go func() {
defer fmt.Println("A.defer")
func() {
defer fmt.Println("B.defer")
runtime.Goexit() // 立即终止当前goroutine
fmt.Println("B")
}()
fmt.Println("A")
}()
其中,打印B和打印A的语句不会执行。