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流程:
  1. 定义领域实体(Entity)映射关系
  2. 定义仓库接口(Repository Interface)数据库关系
  3. 定义服务接口(Service Interface)API接口
  4. 实现服务(Service Implementation)逻辑层
  5. 实现传输层(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 并发编程

  • select 做并发控制

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 代码风格