Go实习面试经(1)

概要

2020年11月5日,初次尝试面试,我对我自己个人品质方面还挺满意的,但是在回答问题、知识掌握程度等方面还有所欠缺。
经过本次面试后,我将自己的优点和不足,在本文章中讲进行总结,并对以后需要改进的地方进行规划。


对自己满意的地方

  • 远程面试的时候,我能感受到我的自信,说话简洁大方。
  • 远程面试钱,我对设备进行的充足的调试、在宿舍内划分出了独立的区域,避免了出现尴尬的情况。

自己的不足

  • 过于好胜,不轻易说自己不会。实际上并不掌握的东西,我也会蒙着回答。

    这并不是个很好的习惯,知之为知之,不知为不知。不清楚的地方可以回答不知道,一方面可以体现出自己实事求是的态度,二方面可以便于用人公司更好地评估自己的水平。

  • 被问到自己不会的题以后,会紧张,之后的问题回答的就有些不足。

    尽量直视自己不会的问题。多面试几次情况就能好一些。

  • 回答问题的总结能力不够。

    很多问题自己可以通过脑图、图像等形式解释清楚,但是到了网络面试的时候(以语音为主的情况下),自己的总结概况成文字描述能力不够,导致有时候我自己也不知道自己说道哪里了。(在讲解TCP握手的时候遇到了这个问题。)

  • 没有经历过在面试中编写算法代码的经历。

    本次面试,被问到了一道非常简单且常规的算法题(求最小公倍数),我虽然知道要怎么做,但是却不能说出自己具体的思路,感觉需要更多的时间去编写代码。

需要改进的地方TODO

  1. 优化自己对进程、线程、协程描述的语言。
  2. 继续练习算法,并且练熟算法。

面试总结

从题目来讲,面试的时候无论面试哪一个岗位,网络知识方面是必考的内容,需要重点掌握。其次面试了两家公司的go开发职位,都有问到进程、线程、协程的区别,对于goer来说,应该掌握这三者的区别。

面试问题:

1. 进程、线程、协程的区别

  • 进程(process):进程是指计算机中已运行的程序
  • 线程(thread):线程是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。
      同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
      一个进程可以有很多线程,每条线程并行执行不同的任务。
  • 协程(coroutine):协程是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。

  协程非常类似于线程。但是协程是协作式多任务的,而线程典型是抢占式多任务的。协作式环境下,下一个进程被调度的前提是当前进程主动放弃时间片;抢占式环境下,操作系统完全决定进程调度方案,操作系统可以剥夺耗时长的进程的时间片,提供给其它进程。
  协程是语言层级的构造,可看作一种形式的控制流,而线程是系统层级的构造,可看作恰巧没有并行运行的线程。这两个概念谁有优先权是争议性的:线程可看作为协程的一种实现,也可看作实现协程的基底。

2. 网络协议相关问题

OCI是哪七层?

OSI七层网络模型 各层的解释 TCP/IP四层概念模型   对应网络协议
应用层(Application) 为应用程序提供服务 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层(Presentation) 数据格式转换、数据加密 Telnet, Rlogin, SNMP, Gopher
会话层(Session) 建立、管理和维护会话 SMTP, DNS
传输层(Transport) 建立、管理和维护端到端的连接 传输层 TCP, UDP
网络层(Network) IP选址及路由选择 网络层 IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层(Data Link) 提供介质访问和链路管理 数据链路层 FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层(Physical) 物理层 IEEE 802.1A, IEEE 802.2到IEEE 802.11

TCP、UDP属于哪一层?

见上表

TCP握手

符号 功能
SYN 请求建立连接符号位
FIN 请求关闭连接符号位
ACK 响应符号位
seq 序号(4字节)
ack
(ACKnum)
确认号(4字节)

建立连接时的握手:(三次握手)

为什么不能用两次或四次握手?

断开连接时的挥手:(四次挥手):

ping命令的细节(过程)

在浏览器中访问域名的过程

3. go协程相关问题

题目:运行一个goroutine协程,其内部是for死循环,在该协程之外,如何给定一个信号,使该协程结束?

func main() {
    ch := make(chan struct{})
    go func() {
        for true {
            if _, ok := <-ch; ok != false {
                runtime.Goexit()
            }
        }
    }
    //给一个信号
    ch <- struct{}{}
}

手写代码,没试过能不能用。

4. 算法相关问题

题目:编写一个求最小公倍数的函数。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注