1.1 Go
1.1.1 Go语言的优点
-
天然支持高并发
Go语言通过goroutine和channel机制,提供了轻量级的并发支持。goroutine的创建和调度开销远小于线程,使得Go在处理高并发场景时表现出色。
-
学习成本低,上手快
Go语言的语法简洁,去除了许多复杂的概念(如继承、泛型等),使得开发者可以快速上手并投入生产。
-
性能高
Go语言编译后的二进制文件直接运行在操作系统上,无需虚拟机,执行效率高。同时,Go的垃圾回收机制经过优化,减少了GC带来的性能损耗。
-
编译后二进制包体积小
Go语言编译后的二进制文件不依赖外部库,体积小,便于部署和分发。
1.1.2 Go和Java的区别
- 语言性: Go简单;Java语言较为复杂,包含更多特性
- 类型系统:
- Go支持类型推断,
- Go不支持继承,使用组合来实现代码复用,更加灵活,松耦合;Java支持继承和多态
- 并发:Go使用goroutines和channels实现并发;Java基于Thread和Runnable实现并发
- 跨平台:Go直接编译为机器码,性能高;Java需要JVM运行,性能相对较低
- 垃圾回收 :Go支持并发垃圾回收,使用并行标记-清除算法;Java使用多种垃圾回收器,如G1、CMS等
1.4 Go其他
1.4.1 深度拷贝
-
使用json序列化、反序列化
通过json序列化和反序列化实现深度拷贝,但性能较低。
-
gob编码
使用gob编码进行深度拷贝,比json性能更好,可以处理更复杂的类型。
-
第三方库
可以使用
github.com/jinzhu/copier等第三方库实现深度拷贝。 -
手动实现
对于简单的结构体,可以手动实现深度拷贝方法。
1.4.4 闭包
闭包 = 一个函数 + 它引用的外部变量的环境
func createCounter() func() int {
count := 0 // 这个变量被“拎”走了
// 返回一个匿名函数(闭包)
return func() int {
count++ // 引用了外部的 count
return count
}
}
- 用途:
- 数据封装/私有化:有点像面向对象里的“私有成员变量”
- 生成器/工厂模式:可以根据参数生成具有不同行为的函数
- 回调与延迟执行:经常用闭包来“捕捉”当前的上下文状态,等以后某个时刻(比如请求返回时)再运行。
- 和函数的区别:
- 普通函数能访问参数+全局变量;闭包还能访问捕获的外部变量
- 普通函数执行完后,参数和局部变量会被释放;闭包的外部变量会一直存在
- 闭包内存占用更大些
- 闭包非并发安全
gin框架是什么,有什么好处
一个用 Go 语言编写的轻量级 Web 开发框架 极速性能: Gin 使用了自定义的 HttpRouter(基于前缀树 Radix Tree),它的路由查找速度比标准库快得多。在高并发 API 场景下,这非常关键。
中间件机制(Middleware): 这是 Gin 的灵魂。你可以轻松地为所有请求添加日志、鉴权、限流、跨域处理,而不需要污染业务逻辑。
参数绑定(Binding): 它能自动把 JSON、Query 参数、表单数据映射到你的 Go struct 中,并自动校验(利用 validator 库)。
异常处理: Gin 内部对 panic 做了中间件级别的捕获(Recovery),防止单个请求的出错导致整个服务崩溃。