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

发布于:2025-02-28 ⋅ 阅读:(12) ⋅ 点赞:(0)

✍个人博客: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 个数据,所以就会阻塞住,解决的办法有两个:

  1. 把 channel 长度调大一点
  2. 把 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)
}