Go学习日记10

1.runtime.GOMAXPROCS
解析:
[1]Go语言中可以通过runtime.GOMAXPROCS()函数设置当前程序并发时占用的CPU逻辑核心数。
[2]Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。

2.Go中的操作系统线程和goroutine的关系
解析:
[1]一个操作系统线程对应用户态多个goroutine。
[2]go程序可以同时使用多个操作系统线程。
[3]goroutine和OS线程是多对多的关系,即m:n。

3.channel
解析:如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。

4.创建channel
解析:通道是引用类型,通道类型的空值是nil。声明的通道后需要使用make函数初始化之后才能使用。

var 变量 chan 元素类型
make(chan 元素类型, [缓冲大小])

5.channel操作
解析:通道有发送、接收和关闭三种操作。如下所示:

ch <- 10 // 把10发送到ch中
x := <- ch // 从ch中接收值并赋值给变量x
close(ch)

6.关闭后的通道特点
解析:
[1]对一个关闭的通道再发送值就会导致panic。
[2]对一个关闭的通道进行接收会一直获取值直到通道为空。
[3]对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。
[4]关闭一个已经关闭的通道会导致panic。

7.无缓冲通道
解析:
[1]无缓冲的通道只有在有人接收值的时候才能发送值。
[2]使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此,无缓冲通道也被称为同步通道。
[3]无缓冲通道上的发送操作会阻塞,直到另一个goroutine在该通道上执行接收操作,这时值才能发送成功,两个goroutine将继续执行。相反,如果接收操作先执行,接收方的goroutine将阻塞,直到另一个goroutine在该通道上发送一个值。

8.单向通道
解析:
[1]chan<- int是一个只能发送的通道,可以发送但是不能接收
[2]<-chan int是一个只能接收的通道,可以接收但是不能发送
说明:关闭已经关闭的channel也会引发panic。

9.select
解析:在某些场景下需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞。为了应对这种场景,Go内置了select关键字,可以同时响应多个通道的操作。如下所示:

select {
    case <-chan1:
       // 如果chan1成功读到数据,则进行该case处理语句
    case chan2 <- 1:
       // 如果成功向chan2写入数据,则进行该case处理语句
    default:
       // 如果上面都没有成功,则进入default处理流程
}

select的使用类似于switch语句,它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信[接收或发送]过程。select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句。

10.WaitGroup对象
解析:WaitGroup对象内部有一个计数器,最初从0开始,它有三个方法:Add(),Done(),Wait()用来控制计数器的数量。Add(n)把计数器设置为n,Done()每次把计数器-1,wait()会阻塞代码的运行,直到计数器地值减为0。

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

这里首先把wg计数设置为100,每个for循环运行完毕都把计数器减一,主函数中使用Wait()一直阻塞,直到wg为0,即所有100个for循环都运行完毕。
说明:WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址。

11.互斥锁和读写锁
解析:
[1]互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。
[2]读写锁分为两种:读锁和写锁。当一个goroutine获取读锁之后,其他的goroutine如果是获取读锁会继续获得锁,如果是获取写锁就会等待;当一个goroutine获取写锁之后,其他的goroutine无论是获取读锁还是写锁都会等待。

12.html/template
解析:template包[html/template]实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。

13.Go模板引擎工作方式
解析:Go模板引擎的工作方式就是对一个模板进行语法分析,接着在执行这个模板的时候,将一个ResponseWriter以及一些数据传递给它。被调用的模板引擎会对传入的已分析模板以及数据进行合并,然后把合并的结果传递给ResponseWriter。

14.gob包
解析:encoding/gob包用于管理由gob组成的流,这是一种在编码器和解码器之间进行交换的二进制数据,这种数据原本是为序列化以及数据传输而设计的,但它也可以用于对数据进行持久化,并且为了让用户能够方便地对文件进行读写,编码器和解码器一般都会分别包裹起程序的写入器以及读取器。

15.sync包
解析:sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。

16.MySQL Workbench
解析:MySQL Workbench是为MySQL设计的ER/数据库建模工具。是著名的数据库设计工具DBDesigner4的继任者。具有设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移的作用。

17.bufio包
解析:bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。

18.suffixarrayb包
解析:suffixarrayb包通过使用内存中的后缀树实现了对数级时间消耗的子字符串搜索。

19.strconv包
解析:strconv包实现了基本数据类型和其字符串表示的相互转换。

20.unsafe包
解析:unsafe包提供了一些跳过go语言类型安全限制的操作。

21.appengine包
解析:appengine包提供Google App Engine的基本函数服务。

参考文献:
[1]Golang sync.WaitGroup的用法:https://studygolang.com/articles/12972?fr=sidebar
[2]如何使用docker部署一个beego项目:https://hacpai.com/article/1526210600840

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章