【Golang 面试题】每日 3 题(六十五)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

193. Go channel 为什么是线程安全的?

Go channel 是线程安全的,原因在于 channel 内部实现了同步机制,它可以保证在多个 goroutine 之间的同步和互斥访问。

具体来说,Go channel 内部实现了两个重要的操作:发送和接收。当一个 goroutine 向一个 channel 发送数据时,如果 channel 已满,那么发送操作会被阻塞,直到 channel 中有足够的空间。同样地,当一个 goroutine 从一个 channel 接收数据时,如果 channel 已空,那么接收操作也会被阻塞,直到 channel 中有新的数据可供接收。

这种阻塞式的操作可以保证 channel 在多个 goroutine 之间的同步和互斥访问,从而避免了多个 goroutine 同时对同一个变量进行修改的竞争条件(race condition)问题。而在 Go 语言中,对于同一个变量的竞争条件问题是需要通过同步机制来解决的。

因此,通过使用 channel,我们可以很方便地实现多个 goroutine 之间的数据交换和同步,而不必担心竞争条件问题。同时,Go channel 还具有一些其他的优点,例如可以实现单向通信、支持多路复用、可用于控制流等。

194. Go channel 如何控制 goroutine 并发执行顺序?

Go channel 可以用于控制 goroutine 的并发执行顺序。具体来说,我们可以利用 channel 的阻塞特性来控制 goroutine 的执行顺序。

比如,我们可以创建一个带缓冲的 channel,并在 goroutine 中向该 channel 中发送数据。当缓冲区已满时,该 goroutine 会被阻塞,直到有其他 goroutine 从 channel 中接收数据,释放出缓冲区空间为止。这样,我们就可以利用 channel 的

缓冲区大小来控制 goroutine 的并发执行数量。

另外,我们还可以使用无缓冲的 channel 来控制 goroutine 的执行顺序。具体来说,我们可以利用 channel 的阻塞特性和同步机制来保证 goroutine 的有序执行。

比如,我们可以创建两个 goroutine,其中一个 goroutine 向一个无缓冲的 channel 发送数据,另一个 goroutine 从该 channel 中接收数据,当该 channel 中有数据时,才会执行该 goroutine。这样,我们就可以保证第一个 goroutine 先执行,并将数据发送到 channel 中,然后第二个 goroutine 才能执行,并从该 channel 中接收数据。

195. 如何用代码实现 goroutine 并发执行顺序?

下面是一个简单的示例代码,演示了如何使用 channel 控制 goroutine 的执行顺序:

go 复制代码
package main
import (
    "fmt"
    "time"
)
func main() {
    ch := make(chan bool)
    go func() {
        fmt.Println("goroutine1")
        ch <- true
    }()
    <-ch
    go func() {
        fmt.Println("goroutine2")
        ch <- true
    }()
    <-ch
    fmt.Println("main goroutine")
}

在上面的代码中,我们创建了一个无缓冲的 channel,分别创建了两个 goroutine,并在第一个 goroutine 执行完成后,再执行第二个 goroutine。最后,我们在主 goroutine 中输出了一条信息,表示整个程序的执行已经结束。

相关推荐
Thecozzy8 小时前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
知无不研8 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
青山是哪个青山8 小时前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain
Dr.kangder8 小时前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
IT_陈寒9 小时前
Python的GIL让我多写了500行代码
前端·人工智能·后端
C++ 老炮儿的技术栈9 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011169 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据9 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
蒸蒸yyyyzwd10 小时前
cpp选手备战后端学习笔记day6 秋招笔试题
笔记·学习