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

✍个人博客:Pandaconda-CSDN博客

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

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

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

199. Go channel 无缓冲怎么实现?

go 复制代码
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 有缓冲怎么实现?

go 复制代码
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 则保障并发执行时的数据传递与协调,防止数据竞争。

go 复制代码
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)
}
相关推荐
言之。3 小时前
Go 语言中的 `select` 语句详解
golang
程序员JerrySUN3 小时前
驱动开发硬核特训 · Day 22(下篇): # 深入理解 Power-domain 框架:概念、功能与完整代码剖析
linux·开发语言·驱动开发·嵌入式硬件
_一条咸鱼_4 小时前
揭秘 Android TextInputLayout:从源码深度剖析其使用原理
android·java·面试
_一条咸鱼_4 小时前
揭秘!Android VideoView 使用原理大起底
android·java·面试
_一条咸鱼_4 小时前
深度揭秘!Android TextView 使用原理全解析
android·java·面试
游离状态的猫14 小时前
JavaScript性能优化实战:从瓶颈定位到极致提速
开发语言·javascript·性能优化
GeekABC4 小时前
FastAPI系列06:FastAPI响应(Response)
开发语言·python·fastapi·web
小彭努力中4 小时前
7.Three.js 中 CubeCamera详解与实战示例
开发语言·前端·javascript·vue.js·ecmascript