Go 并发编程面试题, Go 语言中主 Goroutine 是如何创建的?
Go 并发编程面试题, Go 语言中主 Goroutine 是如何创建的?
QA
Step 1
Q:: Go 语言中主 Goroutine 是如何创建的?
A:: 在 Go 语言中,主 Goroutine 是由运行时自动创建的。当你运行一个 Go 程序时,Go 运行时会创建一个主 Goroutine 来执行 main
函数。这是程序的入口点,主 Goroutine 会在 main
函数结束时退出,程序的执行也随之结束。
Step 2
Q:: Go 的并发模型是什么?
A:: Go 语言使用的是基于 CSP(Communicating Sequential Processes)的并发模型,这种模型通过 Goroutines 和 Channels 来实现。Goroutines 是轻量级线程,多个 Goroutines 可以在同一进程中并发执行;Channels 是 Goroutines 之间的通信机制,允许它们之间传递数据和同步操作。
Step 3
Q:: Go 中如何创建一个新的 Goroutine?
A:: 在 Go 中创建一个新的 Goroutine 非常简单,只需要在函数调用前加上 go
关键字即可。例如:go myFunction()
,这将创建一个新的 Goroutine 来执行 myFunction
,而调用 Goroutine 会继续执行其后续代码。
Step 4
Q:: 什么是 Goroutine 泄漏,如何防止?
A:: Goroutine 泄漏是指 Goroutine 启动后未正常退出,导致资源未被释放,最终导致内存泄漏。为了防止 Goroutine 泄漏,必须确保每个启动的 Goroutine 都能够正常退出。常用的防止 Goroutine 泄漏的方式包括:使用 context
来控制 Goroutine 的生命周期,使用 select
和 channel
来确保 Goroutine 正常退出。
Step 5
Q:: Go 中的 Channel 是如何工作的?
A:: Channel 是 Go 中用来在 Goroutines 之间传递数据的机制。Channel 是类型化的管道,可以通过 make
函数创建。通过 <-
操作符可以在 Channel 中发送和接收数据。无缓冲 Channel 是同步的,发送操作会阻塞直到有 Goroutine 接收数据,缓冲 Channel 可以存储一定量的数据,发送操作在缓冲区满之前不会阻塞。
Step 6
Q:: Go 中的无缓冲和有缓冲 Channel 有什么区别?
A:: 无缓冲 Channel 是同步的,意味着发送和接收操作会互相阻塞,直到两者都准备好。这种机制常用于确保两个 Goroutine 在某个点上同步。有缓冲 Channel 则允许在不阻塞的情况下存储一定数量的数据,只有当缓冲区满时发送操作才会阻塞,当缓冲区为空时接收操作才会阻塞。