【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)
}
相关推荐
2302_8097983216 分钟前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
蓝婷儿21 分钟前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
孔令飞33 分钟前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
渣渣盟37 分钟前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
zhojiew40 分钟前
关于akka官方quickstart示例程序(scala)的记录
后端·scala
jackson凌1 小时前
【Java学习笔记】SringBuffer类(重点)
java·笔记·学习
sclibingqing1 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
糯米导航1 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
糯米导航1 小时前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计
MessiGo2 小时前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式