1. golang 文件初始化的顺序

init() 函数是 Go 程序初始化的一部分。由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。
总结顺序如下:
import –> const –> var –> init() / init2() –> main()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main  

import "fmt"

func init() {
fmt.Println("init1:", a)
}

func init() {
fmt.Println("init2:", a)
}

var a = 10
const b = 100

func main() {
fmt.Println("main:", a)
}
// 执行结果
// init1: 10
// init2: 10
// main: 10

// or

// init2: 10
// init1: 10
// main: 10

2. interface 如何比较

Golang 中, interface 内部包含了两个字段,类型 T 和值 V ,interface 之间可以用 == 或 != 进行比较。两个 interface 之间可能包含以下两种情况:

  1. 两个都是 nil (对应的 T 和 V 都为 unset 的状态)
  2. T 相同,且 V 相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type User struct {  
UserName string `json:user_name`
}

type UserFace interface{}

func main() {
// 实际比较的是两个结构体的地址
var u1, u2 UserFace = &User{"Tom"}, &User{"Tom"}
// 比较两个结构体
var u3, u4 UserFace = User{"Tom"}, User{"Tom"}
fmt.Println(u1 == u2) // false
fmt.Println(u3 == u4) // true
}

3. interface 和 nil

上边讲了 interface 包含两个字段,那么一个 nil 的空结构体和 nil 是否真的相等呢?可以看下面这个例子:

1
2
3
4
5
6
7
func main() {  
var p *int = nil
var i interface{} = p
fmt.Println(i == p) // true
fmt.Println(p == nil) // true
fmt.Println(i == nil) // false
}

将 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反序列化响应数据,并处理结果。

14. golang 压测 pprof,火焰图