【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 中输出了一条信息,表示整个程序的执行已经结束。

相关推荐
红烧大青虫6 分钟前
HarmonyOS应用开发实战:小事记 - 数据迁移策略:RDB 表结构变更的版本号管理与 onUpgrade 回调
后端·华为·harmonyos·鸿蒙系统
理人综艺好会7 分钟前
AI Agent时代,gRPC为什么还没过时?
go·grpc
测试界的世清17 分钟前
各大厂软件测试面试题+答案纯干货
面试·职场和发展
geovindu33 分钟前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
学逆向的34 分钟前
汇编——JCC指令
开发语言·汇编·网络安全
mayaairi1 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
liang_jy2 小时前
内存管理(七)—— 内存映射
面试·操作系统
阳光是sunny2 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
前端工作日常2 小时前
我学习到的Java中domain和dto区别
java·后端
liang_jy2 小时前
内存管理(六)—— 进程的内存映像
面试·操作系统