golang的一些基础知识(四) | 青训营笔记

70 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的语句不会执行。