阶段3(下):RAG、向量数据库专题;接入 BOSS直聘调研(research/、岗位对照和延伸技术栈);新增 cs 领域和 12 个技术栈骨架;面试题全部补齐追问并加入校验

This commit is contained in:
Shikui Wang committed 2026-10-23 15:56:03 +08:00
1 parent 7f52513ffc
commit 6650f7eb6d
52 files changed
+2777 -38

No files matched your search

+8
View File
@@ -32,6 +32,8 @@ week: [1, 3, 16]
**参考答案**:需要修改接收者、或者结构体很大(避免拷贝)时用指针接收者;小的、不可变的值类型可以用值接收者。同一个类型的方法风格保持一致。注意:指针接收者的方法只属于 `*T` 的方法集,所以只有 `*T` 实现了相关接口。
**追问**:同一个类型的方法接收者可以混用吗?→ 语法上可以,但一般建议统一:只要有一个方法需要指针接收者,就全部用指针接收者,避免实现接口时出现困惑。
### 【基础】Go 为什么没有异常?错误怎么处理?
**参考答案**:Go 把错误当成普通返回值,强制调用方显式处理,控制流清楚。用 `fmt.Errorf("...: %w", err)` 包装错误加上下文,用 `errors.Is` / `errors.As` 判断。`panic` 只用于不可恢复的错误,HTTP 服务用中间件 `recover` 兜底。
@@ -62,10 +64,14 @@ week: [1, 3, 16]
**参考答案**:在调用链上传递取消信号、截止时间和请求范围的值。HTTP 请求结束或超时,所有带这个 context 的数据库查询、下游调用都会及时停止,避免资源浪费。规范:作为第一个参数传递、不要存进结构体、不要传 nil(用 `context.TODO()`)、`WithValue` 只放请求范围的元数据(如请求 ID),不放业务参数。
**追问**:context 里适合存什么值?→ 只存请求范围的元数据(请求 ID、用户身份、追踪信息),不要用它传递业务参数;key 用自定义的未导出类型,避免冲突。
### 【进阶】什么是数据竞争?怎么发现和避免?
**参考答案**:多个 goroutine 同时访问同一变量且至少一个是写,又没有同步。用 `go test -race` / `go run -race` 发现(只能发现实际执行到的路径)。避免:用 channel 传递所有权、`sync.Mutex` / `RWMutex` 加锁、`sync/atomic` 原子操作;并发读写 map 会直接 fatal。
**追问**:`-race` 能在生产环境开吗?→ 一般不开:会显著增加 CPU 和内存开销。在测试和预发环境开启,CI 中跑 `go test -race`。
## 场景题
### 【场景题】一个接口要并发调用 3 个下游服务,整体 2 秒超时,任一失败就返回错误,怎么写?
@@ -83,3 +89,5 @@ week: [1, 3, 16]
### 【场景题】服务发布时如何做到不丢请求?
**参考答案**:优雅关机:监听 SIGTERM,调用 `http.Server.Shutdown(ctx)` 停止接收新连接并等待处理中的请求完成(带超时);后台 worker 通过 context 收到取消信号,处理完当前任务再退出;最后关闭数据库连接池。部署侧配合负载均衡的健康检查,先摘流量再停进程。在本计划第 1 周第 7 天实现过。
**追问**:Kubernetes 环境下还要注意什么?→ 收到 SIGTERM 后先让就绪探针失败,等待负载均衡摘掉流量(或配置 preStop 等待),再关闭服务;`terminationGracePeriodSeconds` 要大于程序的优雅退出超时。