Golang语言面试题 - 基本原理
1. golang 文件初始化的顺序
init() 函数是 Go 程序初始化的一部分。由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。
总结顺序如下:
import –> const –> var –> init() / init2() –> main()
1 | package main |
2. interface 如何比较
Golang 中, interface 内部包含了两个字段,类型 T 和值 V ,interface 之间可以用 == 或 != 进行比较。两个 interface 之间可能包含以下两种情况:
- 两个都是 nil (对应的 T 和 V 都为 unset 的状态)
- T 相同,且 V 相同
1 | type User struct { |
3. interface 和 nil
上边讲了 interface 包含两个字段,那么一个 nil 的空结构体和 nil 是否真的相等呢?可以看下面这个例子:
1 | func main() { |
将 nil 非 interface 的值 p 赋给 i 的时候,i 实际上是 (T=*int, V=nil)。当二者相比较时,Go 会将 p 先转换成 interface 类型的再去比较,此时二者等价。
p 与 nil 是直接比较的值,因此二者也等价。
i 与 nil 比较时,会将 nil 转换为接口 (T=nil, V=nil),与 i (T=*int, V=nil) 不相等,因此 i != nil
4. GC 初步理解
6. Gin 框架简介
7. 反射的原理
10. oom ?
11. 内存管理方式
13. GRPC 以及 protobuf 协议优化
gRPC的核心概念包括:
RPC(Remote Procedure Call,远程过程调用):gRPC提供了一种简单的RPC机制,允许客户端和服务器之间无缝通信。客户端通过调用本地方法,实际上是在远程服务器上执行方法,并将结果返回给客户端。
Protocol Buffers:gRPC使用Protocol Buffers作为数据序列化和传输格式。Protocol Buffers是一种轻量级、高效的数据结构序列化库,可以在多种编程语言之间实现无缝通信。
HTTP/2:gRPC使用HTTP/2作为传输协议,利用HTTP/2的多路复用、流控制、压缩等特性,实现低延迟、高吞吐量的通信。
RPC调用:gRPC的RPC调用过程可以分为以下步骤:
客户端通过Protocol Buffers序列化请求数据,并使用HTTP/2发送请求。
服务器接收请求,使用Protocol Buffers反序列化请求数据。
服务器执行RPC方法,并将结果序列化为Protocol Buffers格式。
服务器使用HTTP/2发送响应给客户端。
客户端使用Protocol Buffers反序列化响应数据,并处理结果。