Loading... ## 下列关于GMP模型的说法中,错误的是? - A:G表示Goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等 - B:P表示逻辑Processor,P 的数量决定了系统内最大可并行的 G 的数量 - C:M 代表着真正的执行计算资源,物理 Processor - D:G对象是不可以重用的,P 和 M 的关系相当于 Linux 系统中的用户层面的线程和内核的线程 Go的GMP模型 G:表示goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。 P:表示逻辑processor,P 的数量决定了系统内最大可并行的 G 的数量(前提:系统的物理cpu核数 >= P的数量);P的最大作用还是其拥有的各种G对象队列、链表、一些cache和状态。 M:M 代表着真正的执行计算资源,物理 Processor。 G 如果想运行起来必须依赖 P,因为 P 是它的逻辑处理单元,但是 P 要想真正的运行,他也需要与 M 绑定,这样才能真正的运行起来,P 和 M 的这种关系就相当于 Linux 系统中的用户层面的线程和内核的线程是一样的。 ## 常见的导致goroutine泄露的场景? 什么是goroutine泄露:Go的并发是以goroutine和channel的形式实现的。协程泄露是指goroutine创建后,长时间得不到释放,并且还在不断地创建新的goroutine协程,最终导致内存耗尽,程序崩溃。 常见的导致goroutine泄露的场景: 缺少接收器,导致发送阻塞 死锁(dead lock) 无限死循环(infinite loops) 深拷贝不会造成goroutine泄露 ## 关于 select 机制,下面说法正确的是 - A:select 机制用来处理异步 IO 问题 - B:select 机制最大的一条限制就是每个 case 语句里必须是一个 IO 操作 - C:golang 在语言级别支持 select 关键字 - D:select 关键字的用法与 switch 语句非常类似,后面要带判断条件 golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行(立即执行:意思是当前Goroutine不会因此操作而被阻塞) select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。 ## 关于 channel,下面语法正确的是 关于 channel,下面语法正确的是 - A:var ch chan int - B:ch := make(chan int) - C:<- ch - D:ch <- 正确答案:**ABC** **官方解析:**对于 “<- ch” 在 select 语句中经常有使用到;也可以用来实现程序的阻塞效果;对于 “ch <-” 没有这样的传值表达 ## 下列属于Go中发生panic的场景是? A 切片越界 B 访问 map 不存在的 key C 空指针调用 D 过早关闭 HTTP 响应体 **官方解析:**go中发生panic的场景: - 数组/切片越界 - 空指针调用。比如访问一个 nil 结构体指针的成员 - 过早关闭 HTTP 响应体 - 除以 0 - 向已经关闭的 channel 发送消息 - 重复关闭 channel - 关闭未初始化的 channel - 未初始化 map。注意访问 map 不存在的 key 不会 panic,而是返回 map 类型对应的零值,但是不能直接赋值 - 跨协程的 panic 处理 - sync 计数为负数。 ## 关于 GoMock,下面说法正确的是 A GoMock 可以对 interface 打桩 B GoMock 可以对类的成员函数打桩 C GoMock 可以对函数打桩 D GoMock 打桩后的依赖注入可以通过 GoStub 完成 全局变量可通过GoStub框架打桩 过程可通过GoStub框架打桩 函数可通过GoStub框架打桩 interface可通过GoMock框架打桩 ## 关于内存泄露,下面说法正确的是 A golang 有自动垃圾回收,不存在内存泄露 B golang 中检测内存泄露主要依靠的是 pprof 包 C 内存泄露可以在编译阶段发现 D 应定期使用浏览器来查看系统的实时内存信息,及时发现内存泄露问题 正确答案:**BD** **官方解析:**内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 在影响软件系统稳定性的因素里,我们最担心的一个问题是内存泄漏,随着系统的运行,系统消耗的内存越来越多,直到最后整个操作系统越来越慢,甚至还会导致系统崩溃。在Go语言里,我们检测内存泄漏主要依靠的是go里面的pprof包,除此之外,我们还可以使用浏览器来查看系统的实时内存信息(包括CPU、goroutine等的信息)。 ## golang 中大多数数据类型都可以转化为有效的 JSON 文本,下面何种类型可以实现? A 指针 B channel C complex D 函数 golang中大多数数据类型都可以转化为有效的JSON文本,除了channel、complex、函数等。 在golang指针中可进行隐式转换,对指针取值,对所指对象进行序列化。 ## Golang map的一个哈希桶最多能存放多少个k-v? 根据map底层代码,tophash存放了哈希值的最高字节,一个桶最多能存放8个键值对。 ## 关于下列代码中符号\_的作用是? ```go package import "fmt" v1, v2, _ := function(...) ``` A 忽略计算结果 B 忽略这个变量 C 只使用该function的init()的函数 D 其他说法均不正确 官方解析: 1、 import中的下滑线:此时“\_”的作用是:当导入一个包的时候,不需要把所有的包都导进来,只需要导入使用该包下的文件里所有的init()的函数。 2、下划线在代码中 作用是:下划线在代码中是忽略这个变量 也可以理解为占位符,那个位置上本应该赋某个值,但是我们不需要这个值,所以就把该值给下划线,意思是丢掉不要,这样编译器可以更好的优化,任何类型的单个值都可以丢给下划线。 最后修改:2024 年 04 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏