全部版块 我的主页
论坛 数据科学与人工智能 IT基础 JAVA语言开发
4151 1
2024-09-06
最新版GO面试宝典,助力快速斩获offer
给大家整理了一些GO工程师面试的题目和答案,希望对大家的学习有所帮助!
1、http2.0和1.1的区别?
多路复用: 1.1每个请求必须是独立的TCP请求, 2.0采用多路复用, 一个TCP连接可以进行多次请求, 大大提升性能
数据传输: 2.0引入数据流的概念, 允许不同请求在同一连接交错发送
头部处理: 2.0 采用HPACK算法对头部数据进行压缩, 降低数据大小和网络开销
二进制协议: http/1.1报文头信息必须是文本, 数据体可以是二进制,也可是文本。2.0 头信息和数据体都是二进制, 更加高效的处理数据
错误处理: 1.1处理错误需要关闭连接, 2.0引入可以在不关闭连接的情况下处理错误

2、protobuf了解过吗? 和有什么区别? 对比json有什么优势? 压缩率对比json来说能达到多少?
和json的对比:
protobuf使用二进制格式, json为文本格式, 所以protobuf的序列化和反序列化更加高效
由于使用二进制传输, protobuf的体积通常更小
protobuf是强类型的, 定义数据结构时必须指定每个字段的类型, 可以减少解析时的错误, json是弱类型的, 不强制字段的类型

3、Go 程序中的包是什么?
包 (pkg) 是 Go 工作区中包含 Go 源文件或其他包的目录。源文件中的每个函 数、变量和类型都存储在链接包中。每个 Go 源文件都属于一个包,该包在文 件顶部使用以下命令声明:
package <packagename>
您可以使用以下方法导入和导出包以重用导出的函数或类型:
import <packagename>

4、什么是 Goroutine?你如何停止它?
一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的Goroutine 线程。Goroutine 线程比标准线程更轻量级,大多数 Golang 程序 同时使用数千个 g、Goroutine。
要创建 Goroutine,请 go 在函数声明之前添加关键字。
go f(x, y, z)
您可以通过向 Goroutine 发送一个信号通道来停止它。Goroutines 只能在被 告知检查时响应信号,因此您需要在逻辑位置(例如 for 循环顶部)包含检 查。
package main
func main() {
  quit := make(chan bool)
  go func() {
     for {
        select {
        case <-quit:
            return
        default:// ...
        }
    }
}()
// ...
quit <- true }

5、Go 语言当中 Channel(通道)有什么特点,需要注意什么?
如果给一个 nil 的 channel 发送数据,会造成永远阻塞如果从一个 nil 的channel 中接收数据,也会造成永久爱阻塞给一个已经关闭的 channel 发送数 据, 会引起 pannic 从一个已经关闭的 channel 接收数据, 如果缓冲区中为 空,则返回一个零值。

6、与其他语言相比,使用 Go 有什么好处?
与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能 和语法决策都旨在让程序员的生活更轻松。
Golang 针对并发进行了优化,并且在规模上运行良好。
由于单一的标准代码格式,Golang 通常被认为比其他语言更具可读性。
自动垃圾收集明显比 Java 或 Python 更有效,因为它与程序同时执行。

7、如下代码
In, err ;= net.Listen("tcp",":8888")
if err != nil {
// handle error       
}
for {
        conn, err := In.Accept()
        if err != nil {
        // handle error
        }
        go handleConnection( conn)
}

代码解释:
这段代码是一个简单的 TCP 服务器,它监听在本地的 8888 端口,等待客户端连接并处理每个连接。
第一行中的 net.Listen() 函数用于创建一个 TCP 监听器,它将监听本地的 8888 端口。如果有错误发生,比如端口已被占用,它将返回一个错误,我们需要在程序中进行处理。
在第二个 for 循环中,使用 In.Accept() 函数接受连接请求,如果连接请求成功,就会返回一个连接对象。如果有错误发生,比如连接被中断,它将返回一个错误,我们也需要在程序中进行处理。
在 go handleConnection(conn) 中启动一个新的 goroutine 来处理每个连接。这里使用了 go 关键字,表示启动一个新的并发执行流程,以避免阻塞主线程。
在 handleConnection() 函数中,可以实现业务逻辑,处理来自客户端的请求和发送响应。这个函数将在新的 goroutine 中运行,以避免阻塞主线程。
总的来说,这段代码实现了一个简单的 TCP 服务器,可以接受多个客户端连接,并在每个连接上运行一个独立的 goroutine 来处理业务逻辑。

8、当 for 运行接收到 100 个网络连接以后,是否会生成新文件? 生成多少个文件?它们的连接信息是怎么表示的?
不会生成新文件。当 for 循环接收到一个新的连接时,会将连接分配给一个新的协程并通过 handleConnection 函数处理连接。在处理连接的过程中,不会生成新文件。
连接信息是保存在内存中的,包括连接的本地地址、远程地址等信息。当连接结束后,这些信息会被释放。因此,不会生成新的文件来保存连接信息。

9、什么是通道(channel)?它的作用是什么?如何创建一个通道?
答:通道(channel)是一种在多个goroutine之间进行通信的机制,它提供了同步和通信的功能。通过通道,一个goroutine可以向另一个goroutine发送数据,并且另一个goroutine可以从通道中接收数据。通道的创建方式是使用make函数,如:ch := make(chan int)。

10、Go中的垃圾回收机制是什么?它如何工作?如何避免垃圾回收的影响?
答:Go中的垃圾回收机制使用标记清除算法,它会定期扫描程序中不再使用的变量,并将其标记为垃圾。当垃圾占用的空间超过一定阈值时,垃圾回收器会开始工作,清除被标记为垃圾的变量所占用的空间。Go的垃圾回收器是并发的,因此可以在程序执行期间自动运行,而不会阻塞程序的执行。
为了避免垃圾回收的影响,可以通过以下方式来减少垃圾的产生:
尽可能使用栈而不是堆,可以通过使用值类型和指针类型的区别来避免在堆上分配内存。
使用对象池来重复利用对象,避免重复创建和销毁对象的开销。
使用标准库提供的内存池,如sync.Pool。

11、Go 中空 struct{} 有哪些用途?
Go语言中的空struct类型struct{}不占用任何内存空间,被称为"空struct"。这种特殊的类型在Go语言中有很多用途,下面是其中一些:
作为信号量(signal):一个channel可以用来传递数据,也可以用来传递信号。如果一个channel只是用来传递信号而不传递数据,可以使用空struct作为信号量。
占位符:在一些数据结构中,需要占用一个位置,但并不需要存储实际的数据。这种情况下可以使用空struct作为占位符。
集合的key:在Go语言中,可以使用map来实现集合(set)的功能。当key值不重要,只关心是否存在时,可以使用空struct作为map的key。这样可以避免分配额外的空间和降低内存占用。
函数参数:当不需要传递参数时,可以使用空struct作为函数参数,以避免分配不必要的内存。
结构体占位符:在定义结构体时,有时候需要为未来添加的字段留出空间。这时可以使用空struct作为占位符,以避免修改已有的代码。
总之,空struct的主要作用是在不需要实际存储数据的情况下占用空间,从而实现一些特殊的功能。使用空struct可以避免额外的内存分配,提高程序的性能和效率。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2024-9-6 17:29:50
/s/1iblTFdXxZJaZRVOeT7fNOQ 提取码: vh2b
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群