1.语法糖的范式
1.1 隐式与显式
- 隐式写法:多值返回、:=短变量声明、接口隐式实现(只需要实现interface所有的方法即可)、defer延迟函数调用、range循环。
- 显式写法:函数声明、变量声明、错误处理。
1.2 类型推断
- 编译器自动识别,简化代码、提高效率。
- 缺点(可读性降低):a := someFunction() // 无法直接看出 a 的类型
- 缺点(意外类型推断):无法看到类型
- 大型项目协作时,增加维护代码的难度。
1.3 函数编程
- 变长参数(与切片有差异)、函数变成返回值(高阶函数)、匿名函数和闭包(声明一个变量是函数)、方法。
1.4 代码结构
- 并发模型,基于CSP,使用channel来通信。
- 静态代码,减少运行时错误。
- 使用package来组织代码
- 性能有优势,编程型语言比解析型语言更有优势。
- 内存管理能力强,具有低开销内存。
1.5 类型转换
- 无隐式类型转换
- 大类型转小类型,容易导致溢出,数据精度丢失。
- 数组和切片之间的转换。
- 接口类型转换,需要类型断言。
- 类型别名和类型之间的转换。
- 使用strconv、gconv包,保障。
- 字符串和数字之间的转换,使用strconv包。因为不能直接转。
1.6 设计模式
- 单例模式:sync.Once
- 工厂模式:根据类型,返回不同的实例。
- 策略模式:根据不同的运行时参数,使用不同的模块。
- 适配器模式:中间加一层函数,用来适配目标接口。
- 装饰器模式:在原来的结构体基础上,添加新的功能。
- 观察者模式:channel和goroutine,select 监听channel
- 原型模式:encoding/gob包进行深度复制,注意深浅拷贝。
- 建造者模式:进行大型函数拆分。
2.工程化常用的写法
2.1 http的restful风格
- http请求进来,就需要json反序列成结构体。
- 返回http响应,也需要把结构体序列化成json。
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
// 反序列化 JSON 数据
var user User
err = json.Unmarshal(body, &user)
// 序列化 User 结构体为 JSON 数据
jsonData, err := json.Marshal(user)
// 将 JSON 数据写入响应主体
w.Write(jsonData)
2.2 json
- 序列化是将结构体(或其他数据类型)转换为 JSON 格式的字节流(通常是字符串)。
- 反序列化是将 JSON 字节流(或字符串)转换回结构体(或其他数据类型)。
2.3 grpc
- 高性能远程过程调用
- 双向流
- 客户端、服务端代码自动生成,隐藏底层生成代码逻辑
- 客户端负载均衡
- 压缩请求头、使用二进制流、减少延迟
- 提高资源利用率
- 采取pb的请求参数
- DDD流程:
- 定义领域实体(Entity)映射关系
- 定义仓库接口(Repository Interface)数据库关系
- 定义服务接口(Service Interface)API接口
- 实现服务(Service Implementation)逻辑层
- 实现传输层(Transport Layer)客户端和服务端通信
2.4 配置
- 自动加载:ini、toml文件
- 中间件配置中心:Etcd、Nacos等
2.5 dao层封装
3. 工程设计
3.1 ddd领域设计
3.2 面向函数
3.3 面向对象
3.4 框架
4. IO与CPU密集型
4.1 IO密集型
4.2 CPU密集型
5. 性能
5.1 垃圾回收
5.2 堆栈底层原理应用
5.3 并发编程
5.4 调优方案
5.5 高可用、高性能、高并发设计
6. 数据安全
6.1 数据类型
- 切片和数组
- 切片:[]int,可变长度,可伸缩场景。
- 数组:[3]int,固定长度,特定场景。
- map
- 数据不安全,无序。
- 适合于关联数据,例如数据库入库。
- 方便查找、插入、删除操作。
- struct
- 聚合数据类型,较为复杂。
- json转换
- 赋值保留副本,避免原本结构体被修改。
- 提供内存分配效率,例如多个变量散乱,利用内存更多。
- 打包传参,一次性返回和传输。
6.2 分布式一致性
6.3 并发竞争
7. 数据结构
7.1 常用类型的坑
7.2 指针与非指针
7.3 类型引用
7.4 链式封装
8. 中间件
8.1 http协议
8.2 grpc协议
8.3 orm映射
gorm.Scopexorm.Sessiongorm:"column:xxx"xorm:"xxx"gorm:"index"xorm:"index"
8.4 依赖库封装
8.5 kafka应用
8.6 redis应用
8.7 mysql应用
9. 你可能踩到的坑
9.1 指针
9.2 数据容量
9.3 代码风格