✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
199. Go channel 无缓冲怎么实现?
package main
import (
"fmt"
"time"
)
func loop(ch chan int) {
for {
select {
case i := <-ch:
fmt.Println("this value of unbuffer channel", i)
}
}
}
func main() {
ch := make(chan int)
ch <- 1
go loop(ch)
time.Sleep(1 * time.Millisecond)
}
这里会报错 fatal error: all goroutines are asleep - deadlock! 就是因为 ch <- 1 发送了,但是同时没有接收者,所以就发生了阻塞。
但如果我们把 ch <- 1 放到 go loop(ch) 下面,程序就会正常运行。
200. Go channel 有缓冲怎么实现?
package main
import (
"fmt"
"time"
)
func loop(ch chan int) {
for {
select {
case i := <-ch:
fmt.Println("this value of unbuffer channel", i)
}
}
}
func main() {
ch := make(chan int,3)
ch <- 1
ch <- 2
ch <- 3
ch <- 4
go loop(ch)
time.Sleep(1 * time.Millisecond)
}
这里也会报 fatal error: all goroutines are asleep - deadlock! ,这是因为 channel 的大小为 3 ,而我们要往里面塞 4 个数据,所以就会阻塞住,解决的办法有两个:
- 把 channel 长度调大一点
- 把 channel 的信息发送者 ch <- 1 这些代码移动到 go loop(ch) 下面 ,让 channel 实时消费就不会导致阻塞了
201. Goroutine 和 Channel 的区别
概念:Goroutine 是 Go 语言提供的轻量级协程,相比传统线程,创建和销毁开销小,可以轻松创建成千上万的实例。Channel 是 Go 语言中的通道,用于在 Goroutine 之间进行安全高效的通信和同步,可避免共享内存带来的并发问题。
作用:Goroutine 用于实现并发编程,提升程序执行效率;Channel 则保障并发执行时的数据传递与协调,防止数据竞争。
package main
import (
"fmt"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("Worker %d started job %d\n", id, j)
// 模拟工作
fmt.Printf("Worker %d finished job %d\n", id, j)
results <- j * 2
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
const numWorkers = 3
for w := 1; w <= numWorkers; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= numJobs; a++ {
<-results
}
close(results)
}