- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Go高频面试题及实战答案
一、基础语法与特性
1.说说Go中值类型和引用类型的区别,各举3个例子
答案:
值类型在赋值/传参时会拷贝完整数据,修改副本不影响原数据;引用类型传递的是内存地址(指针),修改副本会同步影响原数据。
值类型:int、struct、array(数组)、bool、float64(任选3个)
引用类型:slice(切片)、map、channel、func(函数)、pointer(指针)(任选3个)
关键注意:切片是引用类型,但切片本身的底层数组可能触发扩容(如append时容量不足),此时会生成新数组,原切片不受影响——这是面试常考的“陷阱点”。
2.Go的defer关键字有什么作用?延迟执行的函数参数何时求值?
答案:
defer用于延迟执行函数(通常是资源释放、错误处理),会在当前函数返回前、return语句执行后触发,多个defer按“后进先出”(LIFO)顺序执行。
参数求值时机:延迟函数的参数在defer声明时就已计算,而非执行时。
示例验证:
funcmain(){
i:=0
deferfmt.Println(i)//声明时i=0,最终输出0
i=10
}
实际用途:关闭文件句柄、释放锁、解锁channel等,避免资源泄露。
3.简述Go的interface(接口)特性,空接口和非空接口的区别
答案:
Go的接口是“隐式实现”——无需显式声明implements,只要类型实现了接口的所有方法,就自动满足该接口,支持多态。
空接口(interface{}):无任何方法,可接收任意类型的值(类似Java的Object),常用于泛型场景(Go1.18前)。
非空接口:包含至少一个方法,如io.Reader(含Read方法),只能接收实现了对应方法的类型。
注意:空接口存储的是“值+类型信息”,非空接口同样存储这两部分,这是接口能实现类型断言的基础。
二、并发编程(Go核心考点)
1.Goroutine和线程的区别是什么?Goroutine的调度模型是什么?
答案:
内存占用:Goroutine初始栈大小仅2KB(可动态扩容至GB级),线程初始栈通常1MB,因此Go能轻松创建数十万Goroutine。
调度方式:线程是OS级调度(抢占式,内核态切换,开销大);Goroutine是Goruntime级调度(M:N调度,用户态切换,开销小)。
调度模型:M-P-G模型
M(Machine):对应OS线程;
P(Processor):逻辑处理器,持有Goroutine队列和线程资源,数量默认等于CPU核心数(GOMAXPROCS);
G(Goroutine):用户态轻量级线程;
核心逻辑:P将G分配给M执行,当G发生阻塞(如IO)时,P会将其转移到阻塞队列,再从就绪队列取新G分配给M,避免M闲置。
2.如何优雅地关闭Goroutine?至少说2种方法
答案:
Goroutine无“强制关闭”机制,需通过“协作式”方式关闭,常见方案:
使用channel通知(最常用):通过一个done通道发送关闭信号,Goroutine监听该通道,收到信号后退出。
示例:
funcworker(donechanstruct{}){
for{
select{
case-done:
fmt.Println(收到关闭信号,退出)
return
default:
//执行业务逻辑
}
}
}
//调用方:close(done)触发关闭
上下文context.Context:通过context.WithCancel创建可取消上下文,传递给Goroutine,调用cancel()函数触发退出,支持多级传递(如父Goroutine关闭时,子Goroutine同步关闭)。
使用共享变量:通过atomic.Bool定义一个退出标志(需保证原子性),Goroutine循环检查该标志,适用于高频轮询场景。
3.channel的无缓冲和有缓冲有什么区别?close通道后读写会发生什么?
答案:
无缓冲channel:发送(ch-x)和接收(-ch)操作是“同步”的——发送方会阻塞直到接收方接收,接收方会阻塞直到发送方发送。
有缓冲channel:发送方仅当缓冲区满时阻塞,接收方仅当缓冲区空时阻塞,本质是“异步通信”的缓冲队列。
close后读写行为:
读
您可能关注的文档
最近下载
- 一年级家长会优秀课件ppt课件.pptx VIP
- 果树栽培学(山东联盟)知到智慧树期末考试答案题库2025年青岛农业大学.docx VIP
- 河道砌石护坡劳务合同4篇.docx VIP
- JCT 841-2024《耐碱玻璃纤维网布》.docx VIP
- 2025年全国危险化学品生产单位主要负责人考试题库(含答案).docx VIP
- 部编新人教版语文六年级上册易读错写错字汇总+课文重点梳理+词语积累.pdf VIP
- 水渠护坡砌石劳务合同8篇.docx VIP
- 《公路泡沫轻质土应用技术规范》.pdf VIP
- 人工智能基础知识考试题库300题(含答案) .pdf VIP
- 教育局书记在全县教育系统党组织书记培训动员会上讲话.docx VIP
原创力文档


文档评论(0)