go语言面试-《GO开发知识笔记》

admin 2025-11-04 01:20:48 编程 来源:ZONE.CI 全球网 0 阅读模式

    参考:https://talkgo.org/开源代码:https://github.com/talkgo/night参考:https://www.kancloud.cn/aceld/golang参考:https://eddycjy.com/1、go的调度2、go struct能不能比较

    1. 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型

    3、go defer(for defer),先进后出,后进先出

    1. func b() {
    2. for i := 0; i < 4; i++ {
    3. defer fmt.Print(i)
    4. }
    5. }

    4、select可以用于什么,常用语gorotine的完美退出

    1. golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
    2. 每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作

    5、context包的用途

    1. Context通常被译作上下文,它是一个比较抽象的概念,其本质,是【上下上下】存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的是Goroutine

    6、client如何实现长连接

    1. server是设置超时时间,for循环遍历的

    7、主协程如何等其余协程完再操作

    1. 使用channel进行通信,context,select

    8、slice,len,cap,共享,扩容

    1. append函数,因为slice底层数据结构是,由数组、len、cap组成,所以,在使用append扩容时,会查看数组后面有没有连续内存快,有就在后面添加,没有就重新生成一个大的素组

    9、map如何顺序读取

    1. map不能顺序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值。

    10、实现set

    1. type inter interface{}
    2. type Set struct {
    3. m map[inter]bool
    4. sync.RWMutex
    5. }
    6. func New() *Set {
    7. return &Set{
    8. m: map[inter]bool{},
    9. }
    10. }
    11. func (s *Set) Add(item inter) {
    12. s.Lock()
    13. defer s.Unlock()
    14. s.m[item] = true
    15. }

    11、实现消息队列(多生产者,多消费者)

    1. 使用切片加锁可以实现

    12、大文件排序

    1. 归并排序,分而治之,拆分为小文件,在排序

    13、基本排序,哪些是稳定的14、http get跟head

    1. HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

    15、http 401,403

    1. 400 bad request,请求报文存在语法错误
    2. 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
    3. 403 forbidden,表示对请求资源的访问被服务器拒绝
    4. 404 not found,表示在服务器上没有找到请求的资源

    16、http keep-alive

    1. client发出的HTTP请求头需要增加Connection:keep-alive字段
    2. Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且"应允"client我暂时不会关闭socket连接

    17、http能不能一次连接多次请求,不等后端返回

    1. http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的原因

    18、tcp与udp区别,udp优点,适用场景

    1. tcp传输的是数据流,而udp是数据包,tcp会进过三次握手,udp不需要

    19、time-wait的作用20、数据库如何建索引21、孤儿进程,僵尸进程22、死锁条件,如何避免23、linux命令,查看端口占用,cpu负载,内存占用,如何发送信号给一个进程24、git文件版本,使用顺序,merge跟rebase25、Slice与数组区别,Slice底层结构26、项目里的微信支付这块,在支付完微信通知这里,收到两次微信相同的支付通知,怎么防止重复消费(类似接口的幂等性),说了借助Redis或者数据库的事务27、项目里的消息推送怎么做的(业务有关)28、Go的反射包怎么找到对应的方法(这里忘记怎么问的,直接说不会,只用了DeepEqual,简单讲了DeepEqual)29、Redis基本数据结构30、Redis的List用过吗?底层怎么实现的?知道但是没用过,不知道怎么实现31、Mysql的索引有几种,时间复杂度32、InnoDb是表锁还是行锁,为什么(这里答不出来为什么,只说了行锁)34、退出程序时怎么防止channel没有消费完,这里一开始有点没清楚面试官问的,然后说了监听中断信号,做退出前的处理,然后面试官说不是这个意思,然后说发送前先告知长度,长度要是不知道呢?close channel下游会受到0值,可以利用这点(这里也有点跟面试官说不明白)35、用过什么消息中间件之类吗?没有36、有什么问题吗?评价?后面还有面试,后面再问吧37、生产者消费者模式,手写代码(Go直接使用channel实现很简单,还想着面试官会不会不让用channel实现,不用channel的可以使用数组加条件变量),channel缓冲长度怎么决定,怎么控制上游生产速度过快,这里没说出解决方案,只是简单说了channel长度可以与上下游的速度比例成线性关系,面试官说这是一种解决方案38、手写循环队列39、写的循环队列是不是线程安全,不是,怎么保证线程安全,加锁,效率有点低啊,然后面试官就提醒Go推崇原子操作和channel40、写完代码面试官说后面问的问题回答就可以,不知道的话没关系41、Linux会不会,只会几个命令,面试官就说一共也就一百多个命令42、TimeWait和CloseWait原因43、线段树了解吗?不了解,字典树?了解44、看过啥源码,nsq(Go的消息中间件),简单问了我里面的waitgroup包证明我看过45、sync.Pool用过吗,为什么使用,对象池,避免频繁分配对象(GC有关),那里面的对象是固定的吗?不清楚,没看过这个的源码46、有什么问题吗?评价?基础不错,Linux尚缺,Go的理解不够深入,高级数据结构不了解,优点是看源码47、后面面试官讲了他们做的东西,主要是广告部分,说日均数据量至少百万以上,多达上亿,高并发使用Go支撑,有微服务,服务治理,说我需要学的东西挺多的48、证明二叉树的叶子节点跟度数为2的节点的关系49、唯一索引和主键索引50、智能指针51、字符串解析为数字(考虑浮点型)52、单点登录,tcp粘包53、手写洗牌54、处理粘包断包实现,面试官以为是negle算法有关,解释了下negle跟糊涂窗口综合征有关,然后面试官觉得其他项目是crud就没问了55、goroutine调度用了什么系统调用,这个不会,面试官想从go问到操作系统,然后以为*作系统基础不好,就问了操作系统问题56、进程虚拟空间分布,全局变量放哪里?答上来57、有没有网络编程,有,怎么看连接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常情况吗?TIME_WAIT很多,为什么?大量短链接58、几种基本排序算法说一下,问了堆的时间复杂度,稳定性,为什么不稳定59、 topk问题,海量数据topk(回答成切分多次加载内存,然后用维持k长度的有序链表,然后被说时间复杂度不好,提示说还是用堆,然后哦哦哦对)最长连续字串和,这里我说的解决方案没用dp(对dp不熟),面试官一直引导我dp,还是不会60、什么是主键61、联合索引和唯一索引62、越多的索引越好吗?63、建立索引要注意什么?64、进程和线程区别?65、死锁?66、tcp三次握手67、http,https68、状态码401,301,302,20169、项目我说只有一台机子,所以用的单机部署,面试官说单机也可以部署多个,有什么方法吗?我说docker,问docker有哪些网络,不熟,dockerfile关键字,只答几个。顺便扯了下nginx转发。70、数据库隔离级别,提交读会造成什么71、go调度72、 goroutine泄漏有没有处理,设置timeout,select加定时器73、mysql高可用的方案74、进程线程区别75、排序算法以及时间复杂度76、怎么学习go77、go的线程,给他讲了跟goroutine调度78、io模型,同步阻塞,同步非阻塞,异步79、cookie和session80、接口kps测试81、redis排行榜数据结构(跳跃表),查询时间复杂度82、redis分布式,如何减少同步延迟83、mysql能实现redis的功能吗84、平时怎么学习?85、看什么书?86、兴趣爱好87、看过google四篇分布式论文吗,没看过89、cap理论,举例90、LRU算法,LFU91、讲讲怎么理解网络编程92、go使用踩过什么坑(for range,数据库连接defer close)93、go优缺点95、go的值传递和引用96、慢查询97、为什么使用pg98、redis的数据类型99、所有左叶子节点的和100、m个n大小的有序数组求并集,一开始是2路归并,求时间复杂度,后来在面试官提醒直接m路归并,求时间复杂度101、static关键字,还有其他关键字吗102、hash表设计,线程安全?103、 线程自己独享什么104、网络编程过程105、select、epoll106、看什么书107、排行榜怎么实现108、go的锁如何实现,用了什么cpu指令109、go的runtime如何实现110、看过sql的连接池实现吗111、ctx包了解吗?有什么用?112、go什么情况下会发生内存泄漏?(他说ctx没有cancel的时候,这个真不知道)113、怎么实现协程完美退出?114、智力题:1000瓶酒中有1瓶毒酒,10只老鼠,7天后毒性才发作,第8天要卖了,怎么求那瓶毒酒?115、简单dp题,n*n矩阵从左上角到右下角有多少种走法(只限往下和往右走)116、用channel实现定时器?(实际上是两个协程同步)117、go为什么高并发好?讲了go的调度模型118、操作系统内存管理?进程通讯,为什么共享存储区效率最高119、实现一个hashmap,解决hash冲突的方法,解决hash倾斜的方法120、怎么理解go的interface121、100亿个数选top5,小根堆122、数组和为n的数组对123、最大连续子数组和124、redis容灾,备份,扩容125、跳跃表,为什么使用跳跃表而不使用红黑树126、输入url后涉及什么127、tcp怎么找到哪个套接字128、ipc方式,共享存储区原理130、进程虚拟空间布局131、进程状态转换132、线程的栈在哪里分配133、多个线程读,一个线程写一个int32会不会有问题,int64呢(这里面试官后来说了要看数据总线的位数,32位的话写int32没问题,int64就有问题)134、判断二叉树是否为满二叉树135、lru实现136、一个大整数(字符串形式表示的),移动字符求比它大的数中最小的137、点赞系统设计13 8、select是随机的还是顺序的?select会随机选择一个可用通道做收发操作13 9、Go语言局部变量分配在栈还是堆?Go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析,当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。查看资料14 0、简述一下你对Go垃圾回收机制的理解?v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier(混合写屏障:优化STW)Golang垃圾回收剖析14 1、简述一下golang的协程调度原理?M(machine): 代表着真正的执行计算资源,可以认为它就是os thread(系统线程)。P(processor): 表示逻辑processor,是线程M的执行的上下文。G(goroutine): 调度系统的最基本单位goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等。查看资料14 2、介绍下 golang 的 runtime 机制?Runtime 负责管理任务调度,垃圾收集及运行环境。同时,Go提供了一些高级的功能,如goroutine, channel, 以及Garbage collection。这些高级功能需要一个runtime的支持. runtime和用户编译后的代码被linker静态链接起来,形成一个可执行文件。这个文件从操作系统角度来说是一个user space的独立的可执行文件。 从运行的角度来说,这个文件由2部分组成,一部分是用户的代码,另一部分就是runtime。runtime通过接口函数调用来管理goroutine, channel及其他一些高级的功能。从用户代码发起的调用操作系统API的调用都会被runtime拦截并处理。Go runtime的一个重要的组成部分是goroutine scheduler。他负责追踪,调度每个goroutine运行,实际上是从应用程序的process所属的thread pool中分配一个thread来执行这个goroutine。因此,和java虚拟机中的Java thread和OS thread映射概念类似,每个goroutine只有分配到一个OS thread才能运行。相关资料14 3、如何获取 go 程序运行时的协程数量, gc 时间, 对象数, 堆栈信息?调用接口 runtime.ReadMemStats 可以获取以上所有信息, 注意: 调用此接口会触发 STW(Stop The World)参考: https://golang.org/pkg/runtime/#ReadMemStats如果需要打入到日志系统, 可以使用 go 封装好的包, 输出 json 格式.参考:1、https://golang.org/pkg/expvar/2、http://blog.studygolang.com/2017/06/expvar-in-action/更深入的用法就是将得到的运行时数据导入到 ES 内部, 然后使用 Kibana 做 golang 的运行时监控, 可以实时获取到运行的信息(堆栈, 对象数, gc 时间, goroutine, 总内存使用等等), 具体信息可以看 ReadMemStats 的那个结构体效果大致如下:go语言面试 - 图114 4、介绍下你平时都是怎么调试 golang 的 bug 以及性能问题的?panic 调用栈pprof火焰图(配合压测)使用go run -race 或者 go build -race 来进行竞争检测查看系统 磁盘IO/网络IO/内存占用/CPU 占用(配合压测)14 5、简单介绍下 golang 中 make 和 new 的区别new(T) 是为一个 T 类型的新值分配空间, 并将此空间初始化为 T 的零值, 并返回这块内存空间的地址, 也就是 T 类型的指针 _T, 该指针指向 T 类型值占用的那块内存. make(T) 返回的是初始化之后的 T, 且只能用于 slice, map, channel 三种类型. make(T, args) 返回初始化之后 T 类型的值, 且此新值并不是 T 类型的零值, 也不是 T 类型的指针 _T, 而是 T 类型值经过初始化之后的引用.

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  12